Вызов функции шаблона в классе шаблона
Отказ от ответственности: Следующий вопрос, вероятно, настолько прост, что я могу быть в шоке, увидев первый ответ. Кроме того, я хочу извиниться за любые повторяющиеся вопросы - синтаксические проблемы не всегда легко идентифицировать как словесное объяснение, и поэтому их поиск не так просто...
Но этого достаточно. У меня есть два шаблонных класса, один из которых имеет шаблонную функцию-член, другой класс пытается вызвать эту функцию. Ниже приведен пример минимальной ошибки:
#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
где все сообщения об ошибках направлены на ссылку, помеченную в коде.
Я уже благодарю вас за ваши идеи, как бы они ни были очевидны.
Ответы
Ответ 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 >
?