在C++中,
在这里,不需要使用
在这种情况下,上下文表明
typename
关键字是必需的,以便编译器可以在模板中区分嵌套类型和嵌套值。然而,在某些情况下,不存在歧义,例如当派生类从嵌套类类型继承时。template <class T>
class Derived : public T::type
{ };
在这里,不需要使用
typename
关键字,事实上甚至不允许使用。这是有道理的,因为上下文消除了歧义。在这里,T::type
必须引用一种类型,因为显然不能从一个值继承。我认为同样的规则也适用于函数模板参数。template <class T>
void foo(const T::type& v)
{
}
在这种情况下,上下文表明
T::type
必须引用一种类型,因为函数参数不能是值。然而,编译器不接受这个。它想要const typename T::type&
。这似乎是不一致的。为什么语言允许在继承的上下文中隐含一个嵌套类型,但在函数参数的上下文中却不允许呢?在两种情况下都不存在歧义,那么为什么需要在其中一种情况下使用typename
而在另一种情况下不需要呢?
T::A * b;
那样造成歧义,但至少这是将函数参数与基类视为不同的原因之一。 - ascheplertypedef T::type alias
或T::type var;
。在我看来,最好的方法是使一切都变得统一,并强制在任何地方使用typename,而不是目前存在的例外情况(基类说明符和成员初始化器)。当然,这永远不会发生,因为这种改变将破坏大量的代码... - Luc Touraille