У мене є такий код:
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
. Кланг показує:
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 компілює це просто чудово.
Примітка
Перш ніж голосувати, щоб закрити як дупе Де і чому я повинен поставити ключові слова "шаблон" та "Ім'я"? будь ласка, врахуйте, що це особливий випадок, коли навіть якщо S
це дійсно залежне ім'я, в контексті цього f
воно не залежало б, якби не факт, що вони є членами поточної інстанції.