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++ 对模板有非标准的名称查找规则;这是他们在此处记录的三项违规行为之一(第三段)。
我相信所有的查找都被推迟到模板被实例化。那时,所有依赖名称都可用,因此通常不需要常用关键字template
和显式成员访问;typename
并且这个编译器不会费心去强制执行它们。
在您的两个派生类中,Type
是一个从属名称,因此(在使用使用标准两阶段查找的编译器时)必须使用typename
:
typename Type insert();
于 2012-07-24T09:31:24.393 回答