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

Mismatch in formal parameter list while compiling template function

我在编译模板函数时遇到编译时错误,错误是:

error C2563 : mismatch in formal parameter list

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

#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;
}

虽然我应该写一个答案给别人看。

在 Martin Morterol 写的评论中,他解释了为什么会出现错误。

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

我假设您想针对负指数进行断言,所以我已经替换了 exp 和指数,它根据假设输出正确的数据。

Exp 是 cmath header 中可用的函数,其中 returns x 的 base-e 指数函数,即 e 的 x 次方:ex.

至于为什么 GCC 编译,它似乎完全忽略了 assert 行,如果我们查看程序集,可以在 godbolt 上看到这一点

https://godbolt.org/z/BZIw8z

如果我们将 assert 替换为 static_assert,gcc 会给出与 clang

相同的错误

https://godbolt.org/z/UpQ6Ks