2013-07-10 256 views
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> 

來自編譯器的消息是:

error: type/value mismatch at argument 1 in template parameter list for ‘template class ITipos’

客戶端代碼是:

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

接口的目的是允許從一個TIPE改造任何類型的,使用上面的聲明,因爲使用正常嘗試(聲明一個虛擬接口將明確),該接口將增長,並且它不會是柔性的話 - 它執行從類型的轉換(>浮,..,等字符串)的報價方法。

回答

4

你引用一個模板作爲參數傳遞給ITipos,不是一類。 將其更改爲:

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