0
template<typename T>
struct self
{
    typedef T type;
};

template<class T>
class A
{
    struct Type { int x; };
};

template<class T>
class B1 : A<T>
{
    Type insert();     // OK
};

template<class T>
class B2 : self< A<T> >::type
{
    Type insert();     // syntax error? Why?
};
4

1 に答える 1

1

Visual C ++には、テンプレートの非標準の名前検索ルールがあります。これは、ここで文書化されている3つの非準拠の1つです(3番目の段落)。

テンプレートがインスタンス化されるまで、すべてのルックアップは延期されると思います。その時点では、すべての依存名が使用可能であるため、通常templatetypenameキーワードと明示的なメンバーアクセスは必要ないことがよくあります。そして、このコンパイラはそれらを強制することを気にしません。

両方の派生クラスで、Typeは依存名であるため、(標準の2段階ルックアップを使用するコンパイラを使用する場合)次のように修飾する必要がありtypenameます。

 typename Type insert();
于 2012-07-24T09:31:24.393 に答える