首页 > 解决方案 > 存在引用和值重载时的模棱两可的函数调用

问题描述

我有以下课程:

template<typename T>
class List {

    void Add(T& item) {//GOOD STUFF}
    void Add(T item) {//More STUFF}
    void Remove(T item) {//STUFF}
};

我正在尝试像下面这样使用它

List<MyClass> list;
MyClass obj;
list.Add(obj); //Here the compiler gets angry :((

关于这个问题,我已经找到了以下三个 SO 问题,但我仍然无法调用任何一种方法。
带有重载 r 值引用函数的不明确调用
带有指针、引用和常量引用参数的函数调用
不明确 不明确的引用/值函数

标签: c++oopoverloading

解决方案


您打算调用哪个函数是不明确的,因为作为参数传递给函数的任何左值都可以隐式转换为引用,因此歧义是不可避免的,如基于值与常量引用的函数重载中所述。

你可以改变这个:

void Add(T item) {}

对此:

void Add(T&& item) {}

Live demo


推荐阅读