Как вызвать функцию члена шаблона?
Возможный дубликат:
Функция члена шаблона С++ класса шаблона, вызванного из функции шаблона
template<class T1>
class A
{
public:
template<class T0>
void foo() const {}
};
template<class T0,class T1>
void bar( const A<T1>& b )
{
b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token"
}
Я могу изменить его на
b->A<T1>::template foo<T0>();
который компилируется отлично. Однако я также могу изменить его на
b.A<T1>::template foo<T0>();
который тоже компилируется. а?
Как правильно вызвать функцию члена шаблона в смысле исходного кода?
Ответы
Ответ 1
Просто нашел:
Согласно С++ '03 Standard 14.2/4:
Когда название специализации шаблона элемента появляется после .
или ->
в постфиксном выражении или после вложенного имени-спецификатора в квалифицированном-id, а постфикс-выражение или квалифицированный-ящик явно зависит от параметра-шаблона (14.6.2), имя шаблона члена должно быть с префиксом ключевого слова template
. В противном случае предполагается, что имя называется не-шаблоном.
Правильный код:
b.template foo<T0>();
Ответ 2
вы можете вызвать функцию следующим образом:
b.template foo<T0>();