C++ 模板化类中的模板化方法

C++ 模板化类中的模板化方法,c++,template-specialization,C++,Template Specialization,我想定义一个模板类 CTest<T> CTest 其中一个方法可以返回类型为的对象 CTest<U> CTest T不一定等于U,如下所示: template<typename T> class CTest { // Properties private: T Prop_1; // Methods public: CTest::CTest (T); CTest::~CTest (); template<typena

我想定义一个模板类

CTest<T>
CTest
其中一个方法可以返回类型为的对象

CTest<U>
CTest
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;
}
int main () {
  CTest<int> Test (1);
  auto Test_2 = Test.Method_1<float> (2.0);
  return 0;
}
模板
类别测试{
//性质
私人:
T项目1;
//方法
公众:
CTest::CTest(T);
CTest::~CTest();
模板
CTest方法_1(U);
};
模板
CTest::CTest(T_Prop_1){
这->道具1=\u道具1;
}
模板
CTest::~CTest(){
}
模板
CTest CTest::方法1(U\P){
测试结果(P),;
返回结果;
}
实际上,我也尝试过用以下方式定义方法_1:

template<typename T>
template<typename U>
CTest<U> CTest<T>::Method_1 (U _P) {
  return CTest<U> (_P);
}
模板
模板
CTest CTest::方法1(U\P){
返回CTest(_P);
}
我尝试按如下方式使用该类:

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;
}
int main () {
  CTest<int> Test (1);
  auto Test_2 = Test.Method_1<float> (2.0);
  return 0;
}
int main(){
CTest试验(1);
自动测试_2=测试方法_1(2.0);
返回0;
}

但我一直遇到编译时错误“无法将函数与现有声明匹配”。提前感谢您的帮助。

您的主要问题似乎是类定义中的构造函数和析构函数:这些应该使用额外的限定条件。删除此垃圾会导致代码与我拥有的所有编译器(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;
}
模板
类别测试{
私人:
T项目1;
公众:
CTest(T);
~CTest();
模板试验方法1(U);
};
模板
CTest::CTest(T_Prop_1){
这->道具1=\u道具1;
}
模板
CTest::~CTest(){
}
模板
模板
CTest CTest::方法1(U\P){
返回CTest(_P);
}
int main(){
CTest试验(1);
自动测试_2=测试方法_1(2.0);
返回0;
}

第二次尝试(
template template
)很好,但是类本身有语法错误-
CTest::CTest()
无效,应该是
CTest()
和dtor。此外,以下划线开头,后跟大写字母的标识符是保留的,您不能使用它们。您使用的某些标识符是保留的,尤其是以下划线(u)开头,后跟大写字母的所有标识符。我不知道这一点。非常感谢,将进行更改。感谢您的编译和试用。