метапрограммирование - tmp c++ что это



Почему возникает ошибка при вызове функции-члена шаблона с явным параметром типа? (1)

Я не понимаю, мне кажется, что вызов 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>();
    }
};

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

this->template f<int>();

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

this->f<int>()

(что вы намеревались), и

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

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

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





metaprogramming