专业化错误:模板成员函数与重载非模板函数之间的冲突

时间:2018-11-05 16:20:28

标签: c++

我想在模板类中放置两种不同的方法,一种应该是函数模板,另一种应该是具有相同名称的非模板函数。这是一个代码的玩具模型,它不能在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表示模板化函数和非模板化函数。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可以添加默认模板参数并删除第二个重载。

template <typename T>
struct A
{
    template <int N = 15>
    T f (T x)
    {
        return N*x;
    }
};