重载模板函数未为特定类型选择正确的版本
Overloaded template function doesn't select the correct version for a specific type
情况是:我有一个通用函数,但想要特定类型的更改版本。
我会本能地编写一个widget const& w
参数,以便能够通过引用接受任何小部件,但在这种情况下无法编译,因为编译器忽略了特定的重载 (2( 并使用泛型 (1(。如果我删除 (2( 参数中的常量,它确实会编译,为什么会这样?
戈德博尔特
struct widget {
int widget_size;
};
// (1)
// compiler uses this instead of (2)
template <typename Arg>
int get_size(Arg && arg) {
return arg.size;
}
// (2)
int get_size(widget const& arg) {
return arg.widget_size;
}
int main() {
widget w;
get_size(w);
}
因为编译器忽略了特定的重载。
请注意,版本 2 是更好的匹配,因为传递的参数缺少const
关键字,版本 1 也缺少const
关键字。
在这种情况下,这不会编译。
Widget
类中没有size
成员变量。它有widget_size
,这会导致编译错误。
int get_size(Arg && arg) {
return arg.widget_size; // See this
}
如果我删除 (2( 参数中的常量,它确实会编译,为什么会这样?
这是因为get_size(w);
开始匹配版本 2,从而省略了编译器检查版本 1 中widget_size
的任何需要。
相关文章:
- 在C++中,如何通过几种类型从元组中选择多个元素
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何为我的数组选择更大的数据类型?
- 根据模板类型选择类模板的成员类型?
- 使模板函数按函数参数选择类型
- 重载模板函数未为特定类型选择正确的版本
- 在运行时选择类成员的类型
- 如何在不同类型的值之间进行选择以传递给多态函数?
- 有条件地选择带有 decltype() 和三元运算符的类型
- 根据动态选择类型C++模板使用情况
- 编译时函数的选择取决于类型大小
- 使用元编程选择 int 类型,将生成错误
- 在泛型编程中选择类型参数
- 根据编译时条件在类型之间选择类型的惯用方法
- 使用if语句选择类型来声明变量C++
- 努力使用模板化结构选择类型
- 地图值类型的选择类型
- 使用mpl::if_和integer模板参数选择类型
- C++为常量选择类型
- 如何在编译时切换/选择类型