功能模板在clang中失败

时间:2016-05-06 20:19:57

标签: c++ clang

我有这段代码以前用Microsoft编译器编译好了。我现在已切换到clang并收到以下错误:

  

错误16错误:预期的会员名称或';'声明后   符'

-

  

错误15错误:在' typename'

之后需要一个合格的名称

代码行

template<typename PRIM> typename const PRIM::OutputPtrType          GetData(unsigned long index = 0) const;

有谁知道问题是什么?

2 个答案:

答案 0 :(得分:3)

将您的typename const切换为const typename

template<typename PRIM> const typename PRIM::OutputPtrType          GetData(unsigned long index = 0) const;

C++ Grammar rules for templatestypename条目,其中包含:

  

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关键字之后,编译器需要一个限定名称。