У меня есть следующий код:
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;
}
При сборке с gcc 9.2 и clang (9.0) я получаю ошибку компиляции из-за templateключевого слова, необходимого для вызова fun. Clang показывает:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Я не понимаю, почему компилятор считает funзависимое имя в контексте f, так как fэто не сам шаблон. Если я заменю Cобычный класс вместо шаблона, ошибка исчезнет; однако, я не понимаю, почему в первую очередь должна быть ошибка, поскольку она не зависит и Sне fзависит TC.
Как ни странно, MSVC 19.22 компилирует это просто отлично.
нота
Перед голосованием закройте как dupe of Где и почему я должен поставить ключевые слова "template" и "typename"? пожалуйста, подумайте, что это особый случай, когда даже если Sэто действительно зависимое имя, в контексте fоно не будет зависимым, если бы не тот факт, что они являются членами текущего экземпляра.