C++模板:没有匹配的调用函数
考虑下面的代码
template <typename T, T one>
T exponentiel(T val, unsigned n) {
T result = one;
unsigned i;
for(i = 0; i < n; ++i)
result = result * val;
return result;
}
int main(void) {
double d = exponentiel<double,1.0>(2.0f,3);
cout << d << endl;
return 0;
}
编译器告诉我这个 没有匹配的函数来调用“exponentiel(float, int)”
为什么?
奇怪的是 exponentiel 与 int 一起使用。
Consider the following code
template <typename T, T one>
T exponentiel(T val, unsigned n) {
T result = one;
unsigned i;
for(i = 0; i < n; ++i)
result = result * val;
return result;
}
int main(void) {
double d = exponentiel<double,1.0>(2.0f,3);
cout << d << endl;
return 0;
}
The compiler tells me this
no matching function for call to 'exponentiel(float, int)'
Why?
What's strange is that exponentiel works with int.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题出在模板参数列表中的
T one
和1.0
上。不能有浮点类型的非类型模板参数,也不能将浮点值作为模板参数传递。这是不允许的(据我所知,没有充分的理由为什么不允许这样做)。
g++ 的错误消息在这里毫无帮助。 Visual C++ 2010 在
main
中使用模板的行上报告以下内容:Comeau Online 报告:
The problem is with the
T one
and the1.0
in the template argument list.You can't have a nontype template parameter of a floating point type and you can't pass a floating point value as a template argument. It's just not allowed (to the best of my knowledge, there's no really good reason why it's not allowed).
g++'s error message here is rather unhelpful. Visual C++ 2010 reports the following on the line where the template is used in
main
:Comeau Online reports: