首页 > 解决方案 > 专业化错误:模板成员函数和重载的非模板函数之间的冲突

问题描述

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

标签: c++

解决方案


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

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

推荐阅读