0

私が取り組んでいるいくつかのコードで問題が発生しています。これは、私が作成できる最も単純化されたバージョンです。

template <class A>
class Outer {
public:
    template <class B>
    class Inner {
    public:
        template <class C>
        void foo(Outer<C>::Inner<C> innerC) { }
    };

    Inner<A> inner;
};

class X {};
class Y {};

int main() {
    Outer<X> outerX;
    Outer<Y> outerY;
    outerX.foo<Y>(outerY.inner);
}

エラーは次のとおりです。

error: expected primary-expression before ">" token

の宣言でコンパイル時にトリガーされvoid fooます。これを実現している私のコードの何が間違っていますか?

言い換えれば、私がやろうとしているのは、ネストされたクラスが任意のテンプレート型を持つネストされたクラスを取り込めるようにすることですが、もちろん、ネストされたクラスのテンプレート型は外側のクラスのテンプレート型に依存するため、::構文を使用しますが、エラーが発生します。

ここでやろうとしていることは良い習慣ではないかもしれないことは理解していますが、この質問の目的はテンプレートの構文をよりよく理解することです.

4

1 に答える 1

2

1からへの変換はありませんInner<C>。それは縮小されたテストケースのエラーですか、それとも次のようになるはずですか:

template <class C>
void foo(C innerC) { }

更新:コードが修正された後、問題はtemplatebeforeの欠如であることがわかりInner<C>ます。それ以外の場合、コンパイラはそれが値であると想定しInnerます。

template <class C>
void foo(Outer<C>::template Inner<C> innerC) { }
于 2012-05-20T20:51:15.743 に答える