编译模板函数时形式参数列表不匹配
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 上看到这一点
如果我们将 assert 替换为 static_assert,gcc 会给出与 clang
相同的错误
我在编译模板函数时遇到编译时错误,错误是:
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 上看到这一点
如果我们将 assert 替换为 static_assert,gcc 会给出与 clang
相同的错误