为什么在间接使用基类 typedef 时不断出现语法错误,而直接使用它就可以了?

Why do I keep on getting a syntax error when using a base class typedef indirectly, when it's fine to use it directly?

本文关键字:错误 语法 就可以 基类 typedef 为什么      更新时间:2023-10-16
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?
};

Visual C++有非标准的模板名称查找规则;这是他们在这里记录的三个不合规行为之一(第三段)。

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

在您的两个派生类中,Type都是一个依赖名称,因此必须(当使用使用标准两阶段查找的编译器时)使用typename:进行限定

 typename Type insert();