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?
};
質問する
102 次
1 に答える
1
Visual C ++には、テンプレートの非標準の名前検索ルールがあります。これは、ここで文書化されている3つの非準拠の1つです(3番目の段落)。
テンプレートがインスタンス化されるまで、すべてのルックアップは延期されると思います。その時点では、すべての依存名が使用可能であるため、通常template
のtypename
キーワードと明示的なメンバーアクセスは必要ないことがよくあります。そして、このコンパイラはそれらを強制することを気にしません。
両方の派生クラスで、Type
は依存名であるため、(標準の2段階ルックアップを使用するコンパイラを使用する場合)次のように修飾する必要がありtypename
ます。
typename Type insert();
于 2012-07-24T09:31:24.393 に答える