首页 > 解决方案 > 重载的模板函数没有为特定类型选择正确的版本

问题描述

情况是:我有一个通用函数,但想要一个特定类型的更改版本。

我会本能地编写一个widget const& w参数,以便能够通过引用接受任何小部件,但在这种情况下不会编译,因为编译器忽略了特定的重载 (2),而是使用了泛型 (1)。如果我删除 (2) 的参数中的 const,它会编译,这是为什么呢?

神螺栓

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);
}

标签: c++

解决方案


因为编译器忽略了特定的重载。

请注意,版本 2 是更好的匹配,因为传递的参数缺少const关键字,而版本 1 也缺少const关键字。

在这种情况下不会编译。

Widget类中没有size成员变量。它 got widget_size,这导致编译错误。

int get_size(Arg && arg) {
   return arg.widget_size; // See this
}

如果我删除 (2) 的参数中的 const,它会编译,这是为什么呢?

这是因为get_size(w);开始匹配版本 2,因此无需编译器widget_size在版本 1 中进行检查。


推荐阅读