我有这段代码以前用Microsoft编译器编译好了。我现在已切换到clang并收到以下错误:
错误16错误:预期的会员名称或';'声明后 符'
-
错误15错误:在' typename'
之后需要一个合格的名称
代码行
template<typename PRIM> typename const PRIM::OutputPtrType GetData(unsigned long index = 0) const;
有谁知道问题是什么?
答案 0 :(得分:3)
将您的typename const
切换为const typename
。
template<typename PRIM> const typename PRIM::OutputPtrType GetData(unsigned long index = 0) const;
C++ Grammar rules for templates
有typename
条目,其中包含:
typename ... opt identifier opt 。
typename nested-name-specifier identifier
const
不是identifier
而是 cv-qualifier
。上下文中的标识符是从属名称。这基本上是PRIM::OutputPtrType
,因为OutputPtrType
将取决于名称PRIM
。对于第二行,我们可以更准确地说PRIM::
是嵌套名称说明符。
修改强>
$14.6:1当qualified-id用于引用不是a的类型时 当前实例化的成员([temp.dep.type])及其成员 nested-name-specifier指的是一个依赖类型,它应该是前缀的 通过关键字typename,形成一个typename-specifier。如果 typename-specifier中的qualified-id不表示类型 节目形成不良。
typename-specifier: typename nested-name-specifier identifier typename nested-name-specifier templateopt simple-template-id
答案 1 :(得分:2)
您必须将const
移到右侧:
template<typename PRIM>
typename PRIM::OutputPtrType const GetData(unsigned long index = 0) const;
^^^^^
或左边:
template<typename PRIM>
const typename PRIM::OutputPtrType GetData(unsigned long index = 0) const;
^^^^^
在typename
关键字之后,编译器需要一个限定名称。