Почему я получаю сообщение об ошибке при попытке вызвать функцию-член шаблона с явным параметром типа? - PullRequest
68 голосов
/ 09 февраля 2011

Я не понимаю, мне кажется, что вызов f совершенно однозначен, но он не компилируется с expected primary-expression before ‘int’. Если я закомментирую строку с вызовом f, он прекрасно скомпилируется.

template<typename T>
struct A {
    template<typename S>
    void f() { }
};

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};

1 Ответ

129 голосов
/ 09 февраля 2011

Это связано с очень неясным положением стандарта, в котором, если у вас есть шаблон, который пытается получить доступ к функции шаблона в объекте, тип которого зависит от аргумента шаблона, вы должны использовать ключевое слово template встранный путь:

this->template f<int>();

Это похоже на странность с typename, которая возникает с зависимыми типами, за исключением применения к функциям.В частности, если вы пропустите ключевое слово template, существует неоднозначность парсинга между

this->f<int>()

(то, что вы хотели) и

((this->f) < int) > ()

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

Надеюсь, это поможет!

...