Как решить эту проблему, вызванную перегрузкой функций?

У меня есть кусок кода, похожий на этот:

#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&)' неоднозначен

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

1 ответ

Решение

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

Другие вопросы по тегам