Вызов функции шаблона внутри класса шаблона - PullRequest
23 голосов
/ 13 сентября 2011

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

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

#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

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

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

Ответы [ 3 ]

42 голосов
/ 13 сентября 2011
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 здесь для подробного объяснения:

4 голосов
/ 13 сентября 2011

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

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

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

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

3 голосов
/ 13 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...