非名前空間スコープでの明示的な特殊化に関する GCC の標準との不一致
C 標準では、明示的なテンプレートの特殊化を任意のスコープで宣言することが明示的に許可されていますここで、対応するプライマリ テンプレートを定義できます。ただし、GCC の動作はこの標準から逸脱しています。この矛盾は、名前空間の外で宣言された明示的な特殊化がコンパイルに失敗する、GCC の最近のバージョンで観察されています。
この問題を説明するには、次のコードを考えてみましょう。
template<typename T> struct Widget { template<typename U> void foo(U) { } template<> void foo(int*) { } };
これは、コードは Clang で正常にコンパイルされますが、GCC でエラーが発生します:
error: explicit specialization in non-namespace scope 'struct Widget<T>'
このエラーは、非名前空間スコープでの明示的な特殊化を明示的に許可する C 標準と矛盾します。 C 標準の [temp.expl.spec] の段落 2 によると:
「明示的な特殊化は、対応するプライマリ テンプレートが定義される任意のスコープで宣言できます。」
この標準からの逸脱は、GCC の潜在的なバグとなります。この問題を報告するには、次の手順に従ってください:
この問題を報告することで、貢献できます。 GCC の改善に取り組み、GCC が C 標準に完全に準拠していることを確認します。
以上がGCC が名前空間外での明示的な特殊化を拒否するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。