35

重複の可能性:
テンプレート関数から呼び出されたテンプレートクラスのC++テンプレートメンバー関数

template<class T1>
class A 
{
public:
    template<class T0>
    void foo() const {}
};

template<class T0,class T1>
void bar( const A<T1>& b )
{
    b.foo<T0>();  // This throws " expected primary-expression before ‘&gt;’ token"
}

に変更できます

b->A<T1>::template foo<T0>();

これは正常にコンパイルされます。ただし、次のように変更することもできます

b.A<T1>::template foo<T0>();

これもうまくコンパイルされます。え?

元のコードの意味で、テンプレートメンバー関数を正しく呼び出すにはどうすればよいですか?

4

2 に答える 2

63

ちょうどそれを見つけました:

C++'03標準14.2/4によると:

メンバーテンプレートの特殊化の名前が後置式の後.または ->後、または修飾IDのネストされた名前指定子の後に表示され、後置式または修飾IDが明示的にテンプレートパラメータに依存する場合(14.6.2 )、メンバーテンプレート名の前にキーワードを付ける必要がありますtemplate。それ以外の場合、その名前は非テンプレートの名前であると見なされます。

正しいコードは次のとおりです。

b.template foo<T0>();
于 2012-10-01T15:25:28.287 に答える
14

次のように関数を呼び出すことができます。

b.template foo<T0>();
于 2012-10-01T15:27:07.447 に答える