7

以下に示すサンプルコードはg++でコンパイルされていません。しかし、それはビジュアルスタジオに取り組んでいます。g++のテンプレートクラス内でテンプレートメンバー関数を使用することは可能ですか?

class Impl
{
public:
        template<class I>
        void Foo(I* i)
        {

        }
};

template<class C>
class D
{
public:
        C c;
        void Bar()
        {
                int t = 0;
                c.Foo<int>(&t);
        }
};

int main()
{
        D<Impl> d;
        d.Bar();
        return 0;
}
4

2 に答える 2

9

問題のステートメントはテンプレートパラメータに依存しているため、コンパイラはCインスタンス化されるまでイントロスペクトすることはできません。関数テンプレートを意味していることを伝える必要があります。

c.template Foo<int>(&t);

そこに入れtemplateないと、ステートメントはあいまいになります。理解するために、次のことを想像してくださいC

class C { const int Foo = 5; }; 
...
c.Foo<int>(&t);

const intコンパイラには、aをaintと比較し、その結果を:のアドレスと比較するように見え&tます(c.Foo<int) > &t

ただし、実際の解決策は、関数呼び出しで明示的なテンプレート引数を省略し、次のようにすることです。

c.Foo(&t);

Cこれは、そのようなaが非テンプレートメンバー関数を持っている場合でも正しいFoo(int)です。一般に、可能な限り少ない仮定で(ただし少なくはない)テンプレートコードを記述します。

于 2012-04-17T07:44:36.727 に答える
4

Foo()templateはテンプレートに依存する名前なので、呼び出しの前に置く必要があります。

template<class C>
void D<C>::Bar()
{
    int t = 0;
    c.template Foo(&t);
}
于 2012-04-17T07:40:59.973 に答える