模板参数推断失败

时间:2012-11-28 02:18:21

标签: c++ templates

我编写了以下代码,其中模板参数推断失败:

template<int>
struct num {};

template<int m>
void match(num<2*m>) {
}

int main()
{
  match(num<2>());
  return 0;
}

我从直觉中知道编译器无法推断出正确的m,但我想了解其失败原因的理论基础。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:6)

好吧,你基本上要求编译器为你解决等式2 * m == 2,以确定m的模板参数match。编译器在模板参数推导期间不解决方程,无论它们是多么简单和明确。

14.8.2.4/14(C ++ 03),14.8.2.5 / 16(C ++ 11)中的语言规范涵盖了您的情况,并有一个类似的例子

  

14 如果在函数模板的声明中使用非类型    template-parameter ,非类型模板参数用于   表达式在函数参数列表中,对应   必须始终明确指定或推断 template-argument   在其他地方因为类型扣除否则总是会失败    template-argument

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>())推导出什么?

相关问题