Dlaczego pojawia się błąd podczas próby wywołania funkcji członka szablonu z jawnym parametrem typu?

Nie rozumiem, wydaje mi się, że wywołanie f jest całkowicie jednoznaczne, ale nie kompiluje się z expected primary-expression before ‘int’. Jeśli skomentuję linię z wywołaniem do f, kompiluje się dobrze.

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

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};
Author: templatetypedef, 2011-02-09

1 answers

Jest to spowodowane bardzo niejasnym przepisem standardu, w którym jeśli masz szablon, który próbuje uzyskać dostęp do funkcji szablonu w obiekcie, którego typ zależy od argumentu szablonu, musisz użyć słowa kluczowego template w dziwny sposób:

this->template f<int>();

Jest to podobne do dziwności z typename, która pojawia się z zależnymi typami, z wyjątkiem zastosowanych do funkcji. W szczególności, jeśli pominiesz słowo kluczowe template, istnieje wieloznaczność parsowania między

this->f<int>()

(what you zamierzony), oraz

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

Co nie ma sensu (stąd twój błąd). Użycie słowa kluczowego template powoduje rozróżnienie i zmusza kompilator do uznania, że patrzy na doskonale poprawne wywołanie funkcji składowej szablonu, a nie zniekształconą masę symboli.

Mam nadzieję, że to pomoże!
 129
Author: templatetypedef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 19:56:13