2016-03-02 5 views
1

У меня есть кусок кода, похожее на это:Как решить неоднозначность, вызванную перегрузкой функции, как это?

#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) собирается выполнить.

error: call of overloaded 'foo(int&)' is ambiguous

Как я могу решить эту проблему?

+2

Используйте одну функцию 'недействительными Foo (const T &) '. –

ответ

2

Вы можете передать по константной ссылке const T& так, что он будет также принимать буквальные константы, или передать по ссылке RValue T&& вместо T так, что он будет принимать только rvalues ​​(как буквальные константы)