【问题标题】:C++ template type specificationC++ 模板类型规范
【发布时间】:2018-05-20 15:25:16
【问题描述】:

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

"参数 1 的类型/值不匹配"

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

考虑:

#include <vector>

void Test() {
}

class Test {
};

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

改成

std::vector<class Test>

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

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

【问题讨论】:

    标签: c++ templates language-lawyer


    【解决方案1】:

    是的,您必须在名称前使用关键字 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]:

    详细类型说明符:

    • 类键属性说明符序列opt嵌套名称说明符opt标识符
    • class-key simple-template-id
    • class-key nested-name-specifier 模板optsimple-template-id
    • 枚举嵌套名称说明符opt标识符

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多