如何解决这样的函数重载引起的歧义?

时间:2016-03-02 19:21:58

标签: c++ literals overloading ambiguous-call

我有一段类似的代码:

#include <iostream>

using namespace std;

template<typename T>
class Class
{
public:
    Class() {}
    void foo(T)  {cout << "foo(T) is called \n";}
    void foo(T&) {cout << "foo(T&) is called \n";}
};

int main()
{
    Class<int> c;
    int a = 1;

    c.foo(1);
    c.foo(a);

    return 0;
}

我希望同时具有函数foo的重载,因为foo(T&)更有效但我不能使用文字常量,因为它的参数和foo(T)将适用于文字常量,尽管它效率不如foo(T&)。但是当我定义这两个函数时,c.foo(a)将要执行时会有一个模糊的调用。

  

错误:调用重载'foo(int&amp;)'是不明确的

我该如何克服这个问题?

1 个答案:

答案 0 :(得分:2)

您可以传递const引用const T&,以便它也接受文字常量,或者通过右值引用T&&而不是T来传递它,这样它才会接受rvalues(就像文字一样)常数)