名前空間スコープ外の明示的な特殊化: 非標準 G のエラー
C テンプレート プログラミングには、コードを効率化するためのクラス メンバーの明示的な特殊化が含まれます世代。ただし、次のコード スニペットに示されているように、明示的な特殊化の配置は重要です:
template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } };
g を使用してコンパイルすると、このコードはエラーになります:
Explicit specialization in non-namespace scope 'class CConstraint'
理解するにはこのエラーが発生した場合は、C 標準を調べる必要があります。C 標準では、テンプレートがメンバーとなっている名前空間内で明示的な特殊化を宣言する必要があると規定されています。上記の例では、CConstraint は名前空間内で宣言されていないため、Verify
VC コンパイラは、この場合は準拠していないため、名前空間スコープ外での明示的な特殊化が許可されます。この動作は標準ではないため、依存しないでください。
解決策:
この問題を解決し、C 標準への準拠を保証するには、明示的な特殊化を宣言する必要があります。専門のテンプレートと同じ名前空間内で。コードの修正バージョンは次のとおりです。
namespace MyNamespace { template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } }; }
CConstraint を MyNamespace 名前空間内にカプセル化することで、明示的な特殊化もその名前空間内で宣言されるようになり、コンパイル エラーが解決されます。
さらに、C 03 では、含まれるクラスを明示的に特殊化せずにメンバー関数を特殊化することが禁止されているため、提供されているセクションで提案されているように、自由関数のアプローチを使用することも検討できます。答え:
namespace detail { template <typename TL> void Verify(int, int[]) {} template <> void Verify<int>(int, int[]) {} } template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); } };
以上がC の名前空間外でクラス メンバーの明示的な特殊化が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。