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