我想在模板类中放置两种不同的方法,一种应该是函数模板,另一种应该是具有相同名称的非模板函数。这是一个代码的玩具模型,它不能在gcc下编译,但是可以在Visual Studio下编译。
#include <iostream>
template <typename T>
struct A
{
template <int N>
T f (T x)
{
return N*x;
}
T f (T x)
{
return f<15>(x);
}
};
template <>
template <int N>
double A<double>:: f(double x)
{
return 0;
}
int main()
{
double x=3;
A<double> a;
std::cout<<a.f<2>(x)<<" "<<a.f(x)<<std::endl;
return 0;
}
错误是“模棱两可的模板专业化”,当我给函数赋予不同的名称时,该错误显然消失了。问题是,出于兼容性原因,我需要f表示模板化函数和非模板化函数。我该如何解决这个问题?
答案 0 :(得分:3)
您可以添加默认模板参数并删除第二个重载。
template <typename T>
struct A
{
template <int N = 15>
T f (T x)
{
return N*x;
}
};