Как использовать передаваемые по ссылке аргументы типа шаблона в шаблонах методов? - PullRequest
0 голосов
/ 18 августа 2010

В настоящее время я пытаюсь получить следующий код для компиляции.Сначала файл заголовка, содержащий класс с шаблоном метода:

// ConfigurationContext.h

class ConfigurationContext
{
    public:
    template<typename T> T getValue(const std::string& name, T& default) const
        {
            ...
        }
}

Где-то еще я хочу вызвать этот метод так:

int value = context.getValue<int>("foo", 5);

Там я получаю следующую ошибку:

error: no matching function for call to 'ConfigurationContext::getValue(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int)'

Я проверил очевидные ошибки, такие как отсутствие включений и тому подобное.Но все вроде бы правильно.Я попытался удалить передачу по ссылке аргумента типа шаблона следующим образом:

template<typename T> T getValue(const std::string& name, T default) const ...

Затем он компилируется без каких-либо ошибок и также работает нормально, но я все же хотел бы передать ссылку здесь...

Кто-нибудь знает, что здесь происходит и как заставить это работать?

1 Ответ

5 голосов
/ 18 августа 2010

5 является литералом, и вы не можете связать литералы с не const ссылками. Возьмите T за копию или за const ссылку:

template<typename T> T getValue(const std::string& name, const T& def) const

(Кстати, я сомневаюсь, что ваш компилятор принимает T default, потому что default является ключевым словом и не должно использоваться в качестве идентификатора.)

Причина, по которой вы не можете этого сделать, заключается в том, что выбор аргументов для не-const ссылки обычно подразумевает, что вызываемый объект может изменить значение, и такие изменения должны отразиться на вызывающем. (См. Как передавать объекты в функции в C ++? ). Однако вы не можете изменять литералы или временные символы. Таким образом, вы не можете передавать их не-1015 * ссылкам.

...