我在C ++中有这个代码
template<typename T>
class DD
: public enumerables<T>
{
...
private:
typename const DD<T>& mContainer;
}
它给了我两个错误消息:
typename const
代码有什么问题?它使用MSVC C ++编译得很好。
typename DD<T>& const mContainer;
和const typename DD<T>& mContainer;
给了我同样的错误。
那么,typename
在那里做什么?你不是指嵌套类型,所以typename
在那里是完全没必要的。我要说错误是由于没有合理使用typename
引起的,而不是通过订购声明的部分或其他任何内容。
它应该是公正的
const DD<T>& mContainer;
甚至
const DD& mContainer;
除了在引入模板类型参数时,关键字typename
必须始终紧跟一个可选的全局范围::
标记,然后是嵌套名称说明符;也就是说,有一个或多个名称空间或类,每个名称后跟::
标记。
请参阅C ++标准中的语法规则:5.2(函数样式转换),7.1.5.3(详细说明的类型说明符)和7.3.3(使用声明)。
此外,14.6p5:“关键字typename
仅适用于限定名称,但这些名称不必依赖。”
Microsoft的编译器接受无效语法是错误的。
如果它帮助某人,因为我没有看到它明确提到作为答案或评论(虽然引用C ++规范引用的答案提到它),如果你在依赖类型存在时收到此错误。
例如:
<template T>
void foo(typename const T::size_type & n);
修复是在const
之前移动typename
:
<template T>
void foo(const typename T::size_type & n);
确认这适用于GCC(4.9)和MSVC(2017)。