使用新表达式的模板参数推断失败
Template argument deduction failure with new expression
我正在处理一个可变参数类模板,但是如果不指定模板参数,我就无法将其与新表达式一起使用(我不想(。我将问题简化为以下代码示例:
template <typename T>
struct Foo
{
Foo(T p)
: m(p)
{}
T m;
};
template <typename T1, typename T2>
struct Bar
{
Bar(T1 p1, T2 p2)
: m1(p1), m2(p2)
{}
T1 m1;
T2 m2;
};
int main()
{
double p = 0.;
auto stackFoo = Foo(p); // OK
auto heapFoo = new Foo(p); // OK
auto stackBar = Bar(p, p); // OK
auto heapBar = new Bar(p, p); // error: class template argument deduction failed
return 0;
}
根据我从cppreference的理解,编译器应该能够在上述每种情况下推断出模板参数。我不知道为什么heapFoo
也没有错误。
那么我在这里错过了什么吗?
我在 Xubuntu 17.10 上使用带有 -std=c++17 标志的 gcc 7.2.0。
Barry 提交的标题为"类模板参数推导在新表达式中失败"的错误 85883 已在 GCC 9 中修复。
该错误不会出现在 GCC 中继 (DEMO( 中。
作为 GCC 7.2 的解决方法,您可以使用如下所示的值初始化形式。 (演示(:
auto heapBar = new Bar{p, p};
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 为什么模板参数推导失败?
- 嵌套参数包扩展失败
- 模板参数的 C++ 自动模板推导失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 在 g++ 6.2.1 中将参数包转发到 constructor() 失败
- 当变量和参数名称匹配时,移动语义构造失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 模板参数推导/替换失败,lambda作为函数指针
- 为什么在 std::transform 中使用函数对象参数失败并且需要 lambda 表达式
- C++模板参数失败,不是从错误派生的
- CreateThread参数失败
- 在CreateProcess中传递命令行参数失败