テンプレート クラスにおけるテンプレート関数の明示的な特殊化: C の構文の難題
指定されたコード スニペットは、次のことを試みたときに発生するプログラミングの難題を例示しています。テンプレート クラス内のテンプレート関数を明示的に特殊化します。 Microsoft Visual C 2008 (VC9) では、コードは正常にコンパイルされます。ただし、Mac 上で GCC 4.2 を使用してコンパイルすると、同じコードでエラーが発生します。
GCC では、明示的な特殊化をクラス外で宣言する必要がありますが、そのための正しい構文は不明です。以下に示すように、明示的な特殊化をクラスの外に配置する最初の試みは間違っています:
template< typename T > template<> inline void C< T >::f< tag >( T ) {}
正しいアプローチには、部分的に特殊化された型のメンバー関数への呼び出しの転送が含まれます。修正されたコードは次のとおりです。
template<class T, class Tag> struct helper { static void f(T); }; template<class T> struct helper<T, tag1> { static void f(T) {} }; template<class T> struct C { // ... template<class Tag> void foo(T t) { helper<T, Tag>::f(t); } };
この変更により、GCC の構文要件を遵守しながら、必要な機能を提供するヘルパー構造が導入されます。明示的な特殊化をクラス自体から分離することにより、コードは正常にコンパイルされ、期待どおりに機能します。
以上がC のテンプレート クラス内のテンプレート関数を正しく明示的に特殊化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。