我想定义一个模板化的类
CTest<T>
其中一个方法可以返回
类型的对象CTest<U>
T不一定等于U,如下:
template<typename T>
class CTest {
// Properties
private:
T Prop_1;
// Methods
public:
CTest::CTest (T);
CTest::~CTest ();
template<typename U>
CTest<U> Method_1 (U);
};
template<typename T>
CTest<T>::CTest (T _Prop_1) {
this->Prop_1 = _Prop_1;
}
template<typename T>
CTest<T>::~CTest () {
}
template<typename T, typename U>
CTest<U> CTest<T>::Method_1 (U _P) {
CTest<U> Result (_P);
return Result;
}
实际上,我也尝试过以下方式定义Method_1:
template<typename T>
template<typename U>
CTest<U> CTest<T>::Method_1 (U _P) {
return CTest<U> (_P);
}
我尝试按如下方式使用该类:
int main () {
CTest<int> Test (1);
auto Test_2 = Test.Method_1<float> (2.0);
return 0;
}
但是我一直得到编译时错误“无法将函数与现有声明匹配”。在此先感谢您的帮助。
答案 0 :(得分:2)
似乎你的主要问题是类定义中的构造函数和析构函数:这些应该使用额外的限定条件。删除这个垃圾导致代码为我编译我拥有的所有编译器(gcc,clang和EDG;对于后者我需要删除auto Test 2 =
)。这是我编译的确切代码:
template<typename T>
class CTest {
private:
T Prop_1;
public:
CTest (T);
~CTest ();
template<typename U> CTest<U> Method_1 (U);
};
template<typename T>
CTest<T>::CTest (T _Prop_1) {
this->Prop_1 = _Prop_1;
}
template<typename T>
CTest<T>::~CTest () {
}
template<typename T>
template<typename U>
CTest<U> CTest<T>::Method_1 (U _P) {
return CTest<U> (_P);
}
int main () {
CTest<int> Test (1);
auto Test_2 = Test.Method_1<float> (2.0);
return 0;
}