C ++模板类型规范

时间:2018-05-20 15:25:17

标签: c++ templates language-lawyer

我有一个与空函数同名的空类。当我尝试将此类作为模板参数传递时,我收到错误:

“参数1 ”

中的类型/值不匹配

'Test'不是参数'_Ty'的有效模板类型参数

考虑:

#include <vector>

void Test() {
}

class Test {
};

int main() {
    std::vector<Test> test;
}

更改为

std::vector<class Test>

似乎有效,但我无法发现,这是标准要求,还是我的编译器随机支持。

有人可以指出,如何解决此问题或链接到标准,这需要这种行为?

1 个答案:

答案 0 :(得分:4)

是的,您必须使用名称前面的关键字class来消除歧义,从而产生详细的类型说明符。

[class.name]/2

(强调我的)

  

如果在变量,函数或变量的范围内声明了类名   同时也声明了同名的枚举器,然后两者都是   声明在范围内,该类只能使用一个引用   elaborated-type-specifier ([basic.lookup.elab])。 [实施例:

struct stat {
  // ...
};

stat gstat;                     // use plain stat to define variable

int stat(struct stat*);         // redeclare stat as function

void f() {
  struct stat* ps;              // struct prefix needed to name struct stat
  stat(ps);                     // call stat()
}
     

- 结束示例]

[dcl.type.elab]

  

阐述型说明符:

     
      
  • class-key attribute-specifier-seq opt nested-name-specifier opt identifier
  •   
  • class-key simple-template-id
  •   
  • class-key nested-name-specifier template opt simple-template-id
  •   
  • enum nested-name-specifier opt identifier
  •