模板化类中的模板化方法

时间:2012-03-07 01:44:44

标签: c++ template-specialization

我想定义一个模板化的类

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;
}

但是我一直得到编译时错误“无法将函数与现有声明匹配”。在此先感谢您的帮助。

1 个答案:

答案 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;
}