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 来表示模板化函数和非模板函数。我该如何解决这个问题?
解决方案
您可以添加默认模板参数并删除第二个重载。
template <typename T>
struct A
{
template <int N = 15>
T f (T x)
{
return N*x;
}
};
推荐阅读
- node.js - 有没有办法手动传递 lambda 函数的事件对象主体中的文件?
- php - 如何将 datetime-local 输入转换为 unix 时间戳?
- three.js - Threebox中的GLTF obj颜色主题
- javascript - socket.io-client 和 useEffect 没有得到更新的反应钩子
- python - 使用 pandas 制作出勤学生报告
- javascript - Webpack 不会将 typescript 编译为 ES5?
- python - 尝试通过 DetailView 构建 url 路径,但在 html 页面中获取重复值
- java - 为什么 IntelliJ IDEA 用 Java 构建 Hello 世界需要这么长时间?
- python - PUG 创建命令没有响应
- pic - 使用 K150 编程器将代码加载到 PIC 时出错