次のようなテンプレートクラスがあります。
template<class T> class C
{
void A();
void B();
// Other stuff
};
template<class T> void C<T>::A() { /* something */ }
template<class T> void C<T>::B() { /* something */ }
私が欲しいのはA
、のデフォルトB
と「その他のもの」を保持しながらのみ、明示的な特殊化を提供することです。
私がこれまでに試したことは
class D { };
template<> void C<D>::A() { /*...*/ } // Gives a link error: multiple definition
私が試みた他のすべてのバリアントは、解析エラーで失敗します。
私がしたこと:
元々の問題は、明示的な特殊化がヘッダーファイルに含まれていたため、複数のオブジェクトファイルにダンプされ、リンクが混乱していたことでした(リンカーは、シンボルのすべてのインスタンスが同じであることに気付かないのはなぜですか?)
解決策は、明示的な特殊化をヘッダーファイルからコードファイルに移動することです。ただし、ヘッダーファイルの他のユーザーをデフォルトバージョンにインスタンス化しないようにするには、プロトタイプをヘッダーに戻す必要がありました。次に、GCCに明示的な特殊化を実際に生成させるために、正しいタイプのダミー変数をコードファイルに配置する必要がありました。