2

template <typename T>
struct A
{
    typedef A<T> super;
};

template <typename T>
struct B : A<T>
{
    B() : super() {} // <-- HERE
};

int main()
{
}

MSVCコンパイラでは、これはそのままコンパイルされます。ただし、gccでは、に変更super()する必要がありA<T>::super()ます。ここではgccが正しいと思いますが、誰かがここでのルールと技術的に正しいコンパイラを理解するのを手伝ってくれるでしょうか?

4

1 に答える 1

6

いいえ、それは従属名なので、Aはクラステンプレートです。完全に修飾するか、ショートカットを使用する必要がありますB::super。後者はまた、それが依存名であり、派生クラスにも多くのテンプレートパラメータがある場合に非常に便利であることをコンパイラに通知します。これは、挿入されたクラス名Bであるために拡張されるためです。B<T, and, stuff>

MSVCは、不完全な2フェーズルックアップのおかげで、ここでは間違っています。基本的に、MSVCでは、すべての依存関係のチェックなどはテンプレートのインスタンス化中にのみ発生しますが、宣言時にチェックする必要があります。

于 2012-08-03T08:51:02.467 に答える