У меня есть следующий код:
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
оно не будет зависимым, если бы не тот факт, что они являются членами текущего экземпляра.