Saya memiliki kode berikut:
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;
}
Saat membuat ini dengan gcc 9.2 dan dentang (9.0), saya mendapatkan kesalahan kompilasi karena template
kata kunci diperlukan untuk memohon fun
. Dentang menunjukkan:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Saya tidak mengerti mengapa kompiler berpikir fun
adalah nama dependen dalam konteks f
, karena f
bukan template itu sendiri. Jika saya berubah C
menjadi kelas reguler alih-alih templat, kesalahan hilang; Namun, saya tidak melihat mengapa harus ada kesalahan sejak awal karena keduanya S
tidak f
bergantung TC
.
Anehnya, MSVC 19.22 mengkompilasi ini dengan baik.
catatan
Sebelum pemungutan suara ditutup sebagai dupe dari Di mana dan mengapa saya harus meletakkan kata kunci "templat" dan "ketik nama"? tolong pertimbangkan ini adalah kasus khusus di mana bahkan jika S
memang nama dependen, dalam konteks f
itu tidak akan tergantung jika bukan karena fakta bahwa mereka adalah anggota Instansiasi saat ini.