【问题标题】:C++ Template Class with Template Constructor带有模板构造函数的 C++ 模板类
【发布时间】:2014-01-19 17:18:51
【问题描述】:

我尝试在 C++ 中实现属性。我不知道为什么,但如果我想编译我的代码,会有很多错误。主要思想是,模板类和模板构造函数将提供需求信息。

如果有人可以帮助我,我将不胜感激!

编译消息:

pi@raspberrypi ~/dev/property $ gcc -std=c++0x -o PropertyTest2 PropertyTest2.cpp
PropertyTest2.cpp:22:16: error: expected ‘;’ at end of member declaration
PropertyTest2.cpp:22:19: error: expected unqualified-id before ‘<’ token
PropertyTest2.cpp: In function ‘int main()’:
PropertyTest2.cpp:34:20: error: use of deleted function ‘PropertyTestClass::PropertyTestClass()’
PropertyTest2.cpp:8:7: error: ‘PropertyTestClass::PropertyTestClass()’ is implicitly deleted because the default definition would be ill-formed:
PropertyTest2.cpp:8:7: error: no matching function for call to ‘Property<int>::Property()’
PropertyTest2.cpp:8:7: note: candidates are:
Property4.cpp:21:2: note: template<int (** G)(), void (** S)(int&)> Property::Property()
Property4.cpp:6:7: note: constexpr Property<int>::Property(const Property<int>&)
Property4.cpp:6:7: note:   candidate expects 1 argument, 0 provided
Property4.cpp:6:7: note: constexpr Property<int>::Property(Property<int>&&)
Property4.cpp:6:7: note:   candidate expects 1 argument, 0 provided
PropertyTest2.cpp:38:20: error: no matching function for call to ‘Property<int>::Set(int)’
PropertyTest2.cpp:38:20: note: candidate is:
Property4.cpp:30:7: note: void Property<T>::Set(T&) [with T = int]
Property4.cpp:30:7: note:   no known conversion for argument 1 from ‘int’ to ‘int&’

属性类(Property.cpp)

#ifndef __PROPERTY_FH__
#define __PROPERTY_FH__


template <class T>
class Property {
private:
    typedef T (*TGetter)(void);
    typedef void (*TSetter)(T &);

    TGetter Getter;
    TSetter Setter;


public:
    typedef T type;

    template<TGetter *G,
             TSetter *S
            >
    Property() {
        this->Getter = G;
        this->Setter = S;
    }

    T Get(void) {
        return (this->Getter)();
    }

    void Set(T &value) {
        (this->Setter)(value);
    }
};

#endif

测试文件(PropertyTest.cpp):

#ifndef __PROPERTY_TEST_FH__
#define __PROPERTY_TEST_FH__

#include <iostream>
#include "Property.cpp"


class PropertyTestClass {
private:
    // ReadWrite Property for age
    int _age;
    int AgeGetter(void) {
        return this->_age;
    }
    void AgeSetter(int &value) {
        this->_age = value;
    }


public:
    // ReadWrite Property for age
    Property<int> age<&PropertyTestClass::AgeGetter, &PropertyTestClass::AgeSetter>;
};

#endif


/**
 * Program Entry
**/
int main() {
    std::cout << "Property Test Programm\n\n";

    PropertyTestClass propTest;


    std::cout << "ReadWrite Property for age\n";
    propTest.age.Set(5);
    std::cout << propTest.age.Get() << "\n";


    return 0;
}

【问题讨论】:

  • 首先,TGetter 和 TSetter 没有在 Property.cpp 中定义。其次,该文件不应具有扩展名.cpp。您的编译器/IDE 可能会尝试自行编译。
  • 零参数函数不要使用(void),使用()即可。 (void) 仅用于 C 兼容性。

标签: c++ templates gcc properties constructor


【解决方案1】:

好的,这次解决了你代码中的所有问题。

属性.cpp:

#ifndef __PROPERTY_FH__
#define __PROPERTY_FH__

#include <boost/function.hpp>

template <class T>
class Property {
private:

    typedef boost::function <T()> TGetter;
    typedef boost::function <void(const T&)> TSetter;

    TGetter Getter;
    TSetter Setter;


public:
    typedef T type;

    Property(TGetter G, TSetter S) {
        this->Getter = G;
        this->Setter = S;
    }

    T Get(void) {
        return (this->Getter)();
    }

    void Set(const T &value) {
        (this->Setter)(value);
    }
};

#endif

PropertyTests.cpp:

#ifndef __PROPERTY_TEST_FH__
#define __PROPERTY_TEST_FH__

#include <iostream>
#include <boost/bind.hpp>
#include "Property.cpp"


class PropertyTestClass {
private:
    // ReadWrite Property for age
    int _age;
    int AgeGetter() {
        return this->_age;
    }
    void AgeSetter(const int &value) {
        this->_age = value;
    }


public:
    // ReadWrite Property for age
    Property<int> age;
    PropertyTestClass() : age(
        boost::bind(&PropertyTestClass::AgeGetter, this),
        boost::bind(&PropertyTestClass::AgeSetter, this, _1))
    {}
};

#endif


/**
 * Program Entry
**/
int main() {
    std::cout << "Property Test Programm\n\n";

    PropertyTestClass propTest;


    std::cout << "ReadWrite Property for age\n";
    propTest.age.Set(5);
    std::cout << propTest.age.Get() << "\n";


    return 0;
}

输出:

$ ./a.out 
Property Test Programm

ReadWrite Property for age
5

【讨论】:

  • 非常感谢。现在我明白你的意思了。
猜你喜欢
  • 1970-01-01
  • 2015-12-08
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2021-03-31
相关资源
最近更新 更多