Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类模板声明中的类型不匹配_C++_Stl - Fatal编程技术网

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

C++ 类模板声明中的类型不匹配,c++,stl,C++,Stl,我正在使用STL开发一个简单的configurator类,但有一个问题困扰着我,下面是基本类中实现CRTP以避免虚拟接口声明的代码: template<typename Tipo, typename Salida > class ITipos{ public: Salida & convertir() { Salida aTipoSalida= static_cast<Tipo *>(this)->convertir_imp

我正在使用STL开发一个简单的configurator类,但有一个问题困扰着我,下面是基本类中实现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;
    }
}
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString,TipoSalida>
模板
ITipos类{
公众:
Salida&convertir()
{
Salida aTipoSalida=static_cast(this)->convertir_imp();
返回aTipoSalida;
}
受保护的:
布尔·麦康沃西诺克;
};
样板
类别提示:公共ITipos
{
使用ITipos::mconversionOk;
公众:
TipoString()
{
mconversionOk=false;
}
TipoSalida&convertir_imp()
{
TipoSalida aTipoSalida;
返回aTipoSalida;
}
}
问题在于TipoString类的声明中,编译器不喜欢此声明:

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;
    }
}
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString,TipoSalida>
模板
类别提示:公共ITipos
来自编译器的消息是:

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

客户端代码为:

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

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

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

template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>
{
    using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk;
    /*...*/
};
模板
类别提示:公共ITipos
{
使用ITipos::mconversionOk;
/*...*/
};

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

template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>
{
    using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk;
    /*...*/
};
模板
类别提示:公共ITipos
{
使用ITipos::mconversionOk;
/*...*/
};