编译模板函数时,形式参数列表不匹配

时间:2019-06-20 12:14:03

标签: c++ template-specialization function-templates

编译模板函数时出现编译时错误,错误是:

  

错误C2563:形式参数列表不匹配

无法弄清楚问题出在哪里,编译器说的不多,您知道问题出在哪里吗?

#include <cmath>    // temporary
#include <iostream>
#include <cassert>

namespace math
{
    //
    // Power function
    //
    template<typename Exp>
    double pow(double base, Exp exponent)
    {
        assert(!(base == 0 && exp <= 0));

        if (base == 0)
            return 0;

        if (exponent == 0 || base == 1)
            return 1;

        if (exponent == 1)
            return base;

        if (exponent < 0)
            return 1 / pow(base, -exponent);

        return base * pow(base, exponent - 1);
    }

    //
    // Power specialization for real exponents
    //
    template<>
    double pow(double base, double exponent)
    {
        // TODO: handle real negative exponents
        return exp(exponent * log(base));
    }
}

int main()
{
    // error C2563:  mismatch in formal parameter list
    std::cout << "pow" << std::endl;
    std::cout << math::pow(1, 2) << std::endl;
    std::cout << math::pow(0, 2) << std::endl;
    std::cout << math::pow(2, 0) << std::endl;
    std::cout << math::pow(3, -4) << std::endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

尽管我应该写一个答案供其他人查看。

在马丁·莫特罗尔(Martin Morterol)的评论中,他解释了为什么会出现错误。

您正在将exp函数与0进行比较。 assert(!(base == 0 && exp <= 0));

我假设您想对负指数进行断言,所以我替换了 带有指数的exp,并根据假设输出正确的数据。

Exp是cmath标头中可用的函数,该函数返回x的基数-e指数函数,该函数将e提升为x的幂:ex。

关于GCC编译的原因,如果我们看一下汇编,似乎它完全忽略了断言行,就像在Godbolt上看到的那样

https://godbolt.org/z/BZIw8z

如果我们用static_assert替换assert,gcc会给我们和clang一样的错误

https://godbolt.org/z/UpQ6Ks