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

Как вызвать функцию члена шаблона?

Возможный дубликат:
Функция члена шаблона С++ класса шаблона, вызванного из функции шаблона

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>();

который тоже компилируется. а?

Как правильно вызвать функцию члена шаблона в смысле исходного кода?

4b9b3361

Ответ 1

Просто нашел:

Согласно С++ '03 Standard 14.2/4:

Когда название специализации шаблона элемента появляется после . или -> в постфиксном выражении или после вложенного имени-спецификатора в квалифицированном-id, а постфикс-выражение или квалифицированный-ящик явно зависит от параметра-шаблона (14.6.2), имя шаблона члена должно быть с префиксом ключевого слова template. В противном случае предполагается, что имя называется не-шаблоном.

Правильный код:

b.template foo<T0>();

Ответ 2

вы можете вызвать функцию следующим образом:

b.template foo<T0>();