模板参数推导失败
Template argument deduction failed
我写了以下代码,模板参数推导失败:
template<int>
struct num {};
template<int m>
void match(num<2*m>) {
}
int main()
{
match(num<2>());
return 0;
}
我凭直觉知道编译器无法推导出正确的m
,但我想了解它失败的理论基础。有人能解释一下吗?
您基本上是要求编译器为您求解方程2 * m == 2
,以便为match
确定模板参数m
。编译器不会在模板参数推导过程中求解方程,无论它们有多简单和明确。
14.8.2.4/14(C++03)、14.8.2.5/16(C++11)中的语言规范涵盖了您的情况,并有一个类似的示例
14如果,在具有非类型的函数模板的声明中模板参数,在函数参数列表中的表达式,对应模板参数必须始终显式指定或推导其他地方,因为否则类型推导总是失败模板参数。
template<int i> class A { /* ... */ };
template<short s> void g(A<s+1>);
void k() {
A<1> a;
g(a); //error: deduction fails for expression s+1
g<0>(a); //OK
}
至于为什么要这样做。。。我认为很明显,在一般情况下,求解数学方程的问题太复杂了。它也可能导致不明确的解决方案或不属于预期领域的解决方案。例如,您希望编译器为match(num<3>())
推导出什么?
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败: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作为函数指针
- 调用基函数时模板参数推导失败
- 类模板参数推导失败会导致替换失败
- 折叠表达式模板参数推导/替换失败
- 结果失败或多个参数无效