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++ 对模板有非标准的名称查找规则;这是他们在此处记录的三项违规行为之一(第三段)。

我相信所有的查找都被推迟到模板被实例化。那时,所有依赖名称都可用,因此通常不需要常用关键字template和显式成员访问;typename并且这个编译器不会费心去强制执行它们。

在您的两个派生类中,Type是一个从属名称,因此(在使用使用标准两阶段查找的编译器时)必须使用typename:

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