私は STL を使用して単純なコンフィギュレーター クラスを開発していますが、問題が少しあります。仮想インターフェイス宣言を回避するために基本クラスで CRTP を実装するコードは次のとおりです。
template<typename Tipo, typename Salida >
class ITipos{
public:
Salida & convertir()
{
Salida aTipoSalida= static_cast<Tipo *>(this)->convertir_imp();
return aTipoSalida;
}
protected:
bool mconversionOk;
};
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString,TipoSalida>
{
using ITipos<TipoString,TipoSalida>::mconversionOk;
public:
TipoString()
{
mconversionOk=false;
}
TipoSalida & convertir_imp()
{
TipoSalida aTipoSalida;
return aTipoSalida;
}
}
問題は TipoString クラスの宣言にあります。コンパイラはこの宣言を好みません。
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString,TipoSalida>
コンパイラからのメッセージは次のとおりです。
エラー: 'テンプレート クラス ITipos' のテンプレート パラメーター リストの引数 1 で型/値が一致しません</p>
クライアントコードは次のとおりです。
TipoBase<std::string> * aTipoBase= new Tipo<std::string,float>;
インターフェイスの意図は、上記の宣言を使用して、タイプから任意の型への変換を許可することです。これは、通常の試みを使用するためです (仮想インターフェイスを宣言すると、型からの変換を実行するメソッドが明示的に提供されます (string -> float,.., etc))、インターフェイスが大きくなり、柔軟性がまったくなくなります。