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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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