编译模板函数时出现编译时错误,错误是:
错误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;
}
答案 0 :(得分:0)
尽管我应该写一个答案供其他人查看。
在马丁·莫特罗尔(Martin Morterol)的评论中,他解释了为什么会出现错误。
您正在将exp函数与0进行比较。
assert(!(base == 0 && exp <= 0));
我假设您想对负指数进行断言,所以我替换了 带有指数的exp,并根据假设输出正确的数据。
Exp是cmath标头中可用的函数,该函数返回x的基数-e指数函数,该函数将e提升为x的幂:ex。
关于GCC编译的原因,如果我们看一下汇编,似乎它完全忽略了断言行,就像在Godbolt上看到的那样
如果我们用static_assert替换assert,gcc会给我们和clang一样的错误