次のようなテンプレート クラスが与えられます。
template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
ヘッダー ファイルでこのクラスを前方宣言するにはどうすればよいですか?
次のようなテンプレート クラスが与えられます。
template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
ヘッダー ファイルでこのクラスを前方宣言するにはどうすればよいですか?
これはあなたがそれを行う方法です:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings;
template<typename Type, typename IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
デフォルトは、実際の定義ではなく、前方宣言にあることに注意してください。
テンプレートの最初の宣言に対してのみ、テンプレートのデフォルト引数を宣言できます。ユーザーがクラス テンプレートを転送宣言できるようにする場合は、転送ヘッダーを提供する必要があります。デフォルトを使用して他の誰かのクラステンプレートを前方宣言したい場合は、運が悪いです!
私が見つけたソリューションは、すべてのパラメーターが既知の場合(またはデフォルトとして提供されている場合)に新しい型を作成することにより、テンプレート クラスの前方宣言の必要性を実際に軽減するため、私の答えは他のものを補完します。もうテンプレート:
template<typename Type=MyDefault, typename IDType=typename Type::IDType>
class MappingsGeneric
{
...
};
class Mappings : public MappingsGeneric<> {};
その後、できclass Mappings;
ます。このソリューションがどこにでも適用できるわけではないことはわかっていますが、単体テストのコンテキストで非仮想メソッドの高性能な依存性注入にのみテンプレートを使用したため、私のユース ケースでは適用されました。