Mam następujący kod:
template <typename TC>
class C
{
struct S
{
template <typename TS>
void fun() const
{}
};
void f(const S& s)
{
s.fun<int>();
}
};
// Dummy main function
int main()
{
return 0;
}
Kiedy buduję to z gcc 9.2 i clang (9.0), pojawia się błąd kompilacji, ponieważ template
słowo kluczowe jest wymagane do wywołania fun
. Clang pokazuje:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Nie rozumiem, dlaczego kompilator myśli fun
w kontekście o nazwie zależnej f
, ponieważ f
sam nie jest szablonem. Jeśli zmienię C
się na zwykłą klasę zamiast szablonu, błąd zniknie; Jednak nie widzę dlaczego nie powinno być błąd w pierwszej kolejności, ponieważ ani S
nie f
zależą TC
.
Co dziwne, MSVC 19.22 dobrze to kompiluje.
Uwaga
Przed głosowaniem, aby zamknąć jako duplikat Gdzie i dlaczego muszę umieścić słowa kluczowe „szablon” i „typename”? proszę wziąć pod uwagę, że jest to szczególny przypadek, w którym nawet jeśli S
jest to nazwa zależna, w kontekście f
nie byłaby zależna, gdyby nie fakt, że są członkami bieżącej instancji.