5

次の形式のコードに問題があります。

template<class Type>
class Class1 {
public:
    template<class TypeName1> TypeName1* method1() const {return 0;}
};

struct Type1{};
struct Type2{};

class Class2 {
public:
   template<typename TypeName1, typename TypeName2>
   int method2() {
       Class1<TypeName2> c;
       c.method1<TypeName1>();
       return 0;
   }

   int method1() {
       return method2<Type1, Type2>();
   }
};

int
main() {
   Class2 c;
   return c.method1();
}

コードパッドでコンパイラを使用してコンパイルした場合:

http://codepad.org/ZR1Std4k

次のエラーが発生します。

t.cpp:メンバー関数'int Class2 :: method2()':15行目:エラー:-Wfatal-errorsが原因で、'>'トークンのコンパイルが終了する前にプライマリ式が必要です。

問題のある行は、テンプレートメンバー関数の呼び出しです。

c.method1<TypeName1>();
4

1 に答える 1

11

templateメンバー関数テンプレートを呼び出すときにキーワードを使用する必要があります。依存する名前がある場合は、次method1のメンバー変数cおよび<「より小さい」シンボルとして解析されます。

c.template method1<TypeName1>();

template@DrewDormannが正しく指摘しているように、キーワードが必要な理由は、Class1提供された特定の型引数に対してクラステンプレートの特殊化が存在する可能性があるためです。ここで、method1は関数テンプレートではなくメンバー変数として定義されます。method1したがって、そうでない場合は、関数テンプレートの名前として解析するようにコンパイラーに明示的に指示する必要があります。

于 2013-02-11T12:14:45.293 に答える