私は次のコードを持っています:
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
。Clangのショー:
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
、それらが現在のインスタンス化のメンバーであるという事実に関係なく依存しないという特別なケースであると考えてください。