テンプレートクラス内のテンプレート関数


119

私はこのコードを持っています:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo() {
            U a;
            a.invoke();
        }
};

この形でそれが欲しい:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo();
};

template <class T> /* ????? */
void MyClass<T>::foo() {
    U a;
    a.invoke();
}

これを行うにはどうすればよいですか?正しい構文は何ですか?


クラスdecl内で関数declを実行しないのはなぜですか(codepad.org/wxaZOMYWを参照)。とにかく、関数declをヘッダーから移動することはできません。そのため、
hiobs

@hiobs:FWIW、宣言をCPPファイルに移動できます。とはいえ、これはハッキングを行うために1回しか行っていません。その場合、これを行う方法を知ることは不可欠です。
Thomas Eding 2013

関数本体が必要とする依存関係を定義した後で、関数定義をクラスの外に移動しなければならない場合があります。これは、クラスAがクラスBを使用し、BもAを使用する場合に発生します。その場合は、AおよびBを宣言してから、AおよびBメソッドを定義します。
Wheezil

回答:


180

これを書いてください:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }

void MyClass <T> :: foo <T>()...おかげで、以前は試してみましたが、うまくいきません。おそらく、クリーンなプロジェクトを実行する必要がありました。
マイケル

@ user1074367:いいえ、私が言うとおりだと思います。
Kerrek SB、2011

3
実際に私は書きました:テンプレート<クラスT>テンプレート<クラスU> void MyClass <T> :: foo(){U a; a.invoke(); そして、それは機能します
マイケル

11
@ user1074367:エラー...はい、それは私が答えで言うものです
Kerrek SB、2011

8
@mike:メンバーテンプレートは完全に通常の一般的なものです。
Kerrek SB 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.