代码之家  ›  专栏  ›  技术社区  ›  Gotcha

C++模板类型规范

  •  1
  • Gotcha  · 技术社区  · 6 年前

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

    参数1的类型/值不匹配

    “test”不是参数“ty”的有效模板类型参数

    考虑:

    #include <vector>
    
    void Test() {
    }
    
    class Test {
    };
    
    int main() {
        std::vector<Test> test;
    }
    

    更改为

    std::vector<class Test>
    

    似乎可以工作,但我不知道这是标准要求的,还是我的编译器随机支持的。

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   songyuanyao    6 年前

    是的,你必须使用关键字 class 为消除歧义而预先准备的名称,这将导致详细的类型说明符。

    [class.name]/2 :

    (强调我的)

    如果在变量、函数或 同时声明相同名称的枚举器,然后当 声明在范围内, 类只能使用 详细的类型说明符 ([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] :

    详细说明的类型说明符:

    • 类键属性说明符seq 选择 嵌套名称说明符 选择 标识符
    • 类键简单模板ID
    • 类键嵌套名称说明符 模板 选择 简单模板ID
    • 枚举 嵌套名称说明符 选择 标识符