2013-07-10 4 views
1

Я разрабатываю простой класс конфигуратора с использованием STL, но я немного застрял с проблемой, вот код, который в базовой Clase реализует 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>; 

Намерение интерфейса, чтобы разрешить преобразование из Отметить Тип любого типа, используя вышеупомянутую декларацию, потому что с помощью обычной попытки (объявляющий виртуальный интерфейс будет явно предлагающий метод, который выполняет преобразование из типов (строка -> float, .. и т. д.)), интерфейс будет расти, и он не будет гибким вообще.

ответ

4

Вы ссылаетесь на шаблон как параметр на ITipos, а не на класс. Измените его на:

template<typename Tipoentrada,typename TipoSalida > 
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida> 
{ 
    using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk; 
    /*...*/ 
}; 
Смежные вопросы