1

私は 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))、インターフェイスが大きくなり、柔軟性がまったくなくなります。

4

1 に答える 1

4

ITiposクラスではなく、へのパラメーターとしてテンプレートを参照しています。次のように変更します。

template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>
{
    using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk;
    /*...*/
};
于 2013-07-10T14:10:40.207 に答える