类模板声明中的类型不匹配

type mismatch in class template declaration

本文关键字:类型 不匹配 声明      更新时间:2023-10-16

我正在使用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>

来自编译器的消息是:

错误:模板参数列表中参数1的类型/值不匹配用于"模板类ITipos"

客户端代码为:

 TipoBase<std::string> * aTipoBase= new Tipo<std::string,float>;

接口的目的是允许使用上面的声明从tipe转换为任何类型,因为使用正常的尝试(声明虚拟接口将显式地提供从类型(string->float,..等)执行转换的方法),接口会增长,而且根本不灵活。

您引用的是模板作为ITipos的参数,而不是类。更改为:

template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>
{
    using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk;
    /*...*/
};