C++模板:没有匹配的调用函数

发布于 2024-10-21 16:01:50 字数 458 浏览 1 评论 0原文

考虑下面的代码

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

面犯桃花 2024-10-28 16:01:50

问题出在模板参数列表中的 T one1.0 上。

不能有浮点类型的非类型模板参数,也不能将浮点值作为模板参数传递。这是不允许的(据我所知,没有充分的理由为什么不允许这样做)。

g++ 的错误消息在这里毫无帮助。 Visual C++ 2010 在 main 中使用模板的行上报告以下内容:

error C2993: 'double' : illegal type for non-type template parameter 'one'

Comeau Online 报告:

line 13: error: expression must have integral or enum type
    double d = exponentiel<double,1.0>(2.0f,3);
                                  ^

line 2: error: floating-point template parameter is nonstandard
    template <typename T, T one>
                          ^

The problem is with the T one and the 1.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:

error C2993: 'double' : illegal type for non-type template parameter 'one'

Comeau Online reports:

line 13: error: expression must have integral or enum type
    double d = exponentiel<double,1.0>(2.0f,3);
                                  ^

line 2: error: floating-point template parameter is nonstandard
    template <typename T, T one>
                          ^
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文