C++. Почему здесь требуется ключевое слово «шаблон»?C++

Программы на C++. Форум разработчиков
Anonymous
C++. Почему здесь требуется ключевое слово «шаблон»?

Сообщение Anonymous »

У меня есть следующий код:

Код: Выделить всё

template 
class C
{
struct S
{
template 
void fun() const
{}
};

void f(const S& s)
{
s.fun();
}
};

// 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();
^
template
Я не понимаю, почему компилятор считает, что fun является зависимым именем в контексте f, поскольку f сам по себе не является шаблоном. Если я изменю C на обычный класс, а не на шаблон, ошибка исчезнет; однако я не понимаю, почему вообще должна быть ошибка, поскольку ни S, ни f не зависят от TC.
Как ни странно, MSVC 19.22 компилирует это просто отлично.

примечание
Прежде чем голосовать, чтобы закрыть как обман, где и почему я должен поставить «шаблон» и «имя типа» ключевые слова? учтите, что это особый случай, когда даже если S действительно является зависимым именем, в контексте f оно не было бы зависимым, если бы не тот факт, что они являются членами текущего экземпляра.

Подробнее здесь: https://stackoverflow.com/questions/600 ... uired-here

Вернуться в «C++»