У меня есть следующий код:
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;
}
При построении этого с g cc 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
.
Как ни странно, MSV C 19.22 компилирует это просто отлично .
note
Перед голосованием закройте как дубликаты Где и почему я должен поставить ключевые слова "template" и "typename"? пожалуйста, примите во внимание это особый случай, когда даже если S
действительно является зависимым именем, в контексте f
оно не будет зависимым, если бы не тот факт, что они являются членами текущего экземпляра.