首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板参数推导失败

模板参数推导失败
EN

Stack Overflow用户
提问于 2012-11-28 10:18:21
回答 1查看 786关注 0票数 5

我写了以下模板参数推导失败的代码:

代码语言:javascript
运行
复制
template<int>
struct num {};

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

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

我凭直觉知道编译器无法推导出正确的m,但我想了解它失败的理论基础。有人能澄清一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-28 10:21:47

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

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

14如果在具有非类型模板参数的函数模板的声明中,在函数参数列表的表达式中使用了非类型模板参数,则必须始终显式指定或在其他地方推导出相应的模板参数,因为对于此类模板参数,类型推导将始终失败。

代码语言:javascript
运行
复制
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>())推导出什么

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13596728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档