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