2012-03-07 5 views
0

Iは、テンプレートクラスを定義したいのいずれかの方法では、TとUと必ずしも等しくないタイプを鋳型方法は

CTest<U> 

のオブジェクトを返すことができた

CTest<T> 

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

あなたの第二の試み( 'テンプレートテンプレートは、')良いですが、クラス自体に構文エラーがある - 'CTEST :: CTESTは()'無効であるとすべき同様に 'CTest()'とdtorになります。アンダースコアで始まり大文字で始まる識別子も予約されており、使用することはできません。 –

+0

使用する識別子の一部は予約されています。特に、アンダースコア(_)で始まり、大文字で始まるすべての識別子が予約されています。 –

+0

それを知らなかった。ありがとう、変更を行います。 – Shredderroy

答えて

1

あなたの主な問題は、クラス定義のコンストラクタとデストラクタです。これらは追加の資格を使用する必要があります。このジャンクを削除すると、私が持っているすべてのコンパイラ(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; 
} 
+0

コンパイルして試していただきありがとうございます。 – Shredderroy