相关疑难解决方法(0)

模板参数类型 `void` 与显式使用 `void`

下面的代码中,为什么模板函数的显式扩展foo无法编译,而 的扩展却bar编译成功?实时链接 - https://godbolt.org/z/o8Ea49KEb

\n
template <typename T1, typename T2>\nT1 foo(T2) { T2(42); return T1{}; };\n\ntemplate <typename T1, typename T2>\nT1 bar(void) { T2(42); return T1{}; };\n\nint main()\n{\n    foo<int, void>();    // fails\n\n    bar<int, void>();    // works\n}\n
Run Code Online (Sandbox Code Playgroud)\n

T2请注意,两个函数的主体中都使用了模板参数,唯一的区别是函数参数 tobar已被手动替换。

\n

这个问题是在阅读std::conditional - Invalid argument type \xe2\x80\x98void\xe2\x80\x99 即使在测试 \'void\'并试图简化问题时受到启发的。

\n

c++

19
推荐指数
2
解决办法
2201
查看次数

组合模板参数形成函数签名时无效的 void 参数

尝试获取两个回调的签名并生成使用它们每个返回值的回调签名。

\n\n

给定回调AB=> 生成F

\n\n

例 1) A: int(char)B: double(bool)=> F: double(int)

\n\n

例 2) A: void(char)B: void(int)=> F: void(void)

\n\n

void使用参数实例化回调时遇到奇怪的编译器错误:

\n\n

error: invalid parameter type \xe2\x80\x98void\xe2\x80\x99

\n\n

有问题的代码

\n\n
template<class Signature>\nstruct my_func;\n\ntemplate<class Ret, class... Args>\nstruct my_func<Ret(Args...)>\n{};\n\ntemplate<class FuncA, class FuncB>\nstruct my_fwd;\n\ntemplate<class ORet, class... OArgs,\n         class Ret, class... Args>\nstruct my_fwd<\n  my_func<ORet(OArgs...)>,\n  my_func<Ret(Args...)>\n  >\n{\n  my_func< ORet(Ret) > func;  // <--- error\n};\n\nint main(int, char *[])\n{\n  my_func<void(int)> my3;  // (1)\n  my_func<void(void)> my4; // …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

4
推荐指数
1
解决办法
1649
查看次数

标签 统计

c++ ×2

c++11 ×1

templates ×1