Подтвердить что ты не робот

Вызов функции шаблона в классе шаблона

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

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

#include <iostream>

template <typename T>
class Foo {
public:
    Foo() {
    }

    template <typename outtype>
    inline outtype bar(int i, int j, int k = 1) {
        return k;
    }

};

template <typename T>
class Wrapper {
public:
    Wrapper() {
    }

    double returnValue() {
        Foo<T> obj;
        return obj.bar<double>(1,2); // This line is faulty.
    }

};

int main() {
    Wrapper<char> wr;
    double test = wr.returnValue();
    std::cout << test << std::endl;
    return 0;
}

При компиляции это приводит к

expected primary-expression before 'double'
expected ';' before 'double'
expected unqualified-id before '>' token

где все сообщения об ошибках направлены на ссылку, помеченную в коде.

Я уже благодарю вас за ваши идеи, как бы они ни были очевидны.

4b9b3361

Ответ 1

obj.bar<double>(1,2); // This line is faulty.

Здесь требуется ключевое слово template, поскольку obj - это экземпляр типа Foo<T>, который зависит от параметра шаблона T, и поэтому приведенное выше должно быть записано как:

obj.template bar<double>(1,2); //This line is corrected :-)

Прочитайте @Johannes ответ здесь для подробного объяснения:

Ответ 2

Как часто: как только вопрос был отправлен, ответ пришел сам по себе. Исправление неисправной строки на

return obj.template bar<double>(1,2);

дает ожидаемые результаты.

Спасибо за чтение...

Ответ 3

Может ли это быть в случае foo.template bar‹ double >?