Me gustaría utilizar una clase de plantilla para proporcionar algunas funcionalidades comunes a algunas clases secundarias que son muy similares. La única variación es la enumeración que cada uno usa.Usar una enumeración como parámetro de plantilla
Esta es la clase padre
template<typename T> class E_EnumerationBase : public SimpleElement
{
public:
E_EnumerationBase();
virtual bool setValue(QString choice);
virtual T getState();
protected:
T state;
QHash<QString, T> dictionary;
};
template<typename T> E_EnumerationBase<T>::E_EnumerationBase() {
state = 0;
}
template<typename T> bool E_EnumerationBase<T>::setValue(QString choice) {
T temp;
temp = dictionary.value(choice, 0);
if (temp == 0) {
return false;
}
value = choice;
state = temp;
return true;
}
template<typename T> T E_EnumerationBase<T>::getState() {
return state;
}
Este es uno de los niños
enum TableEventEnum {
NO_VALUE = 0,
ATTRACT = 1,
OPEN = 2,
CLOSED = 3
};
class E_TableEvent : public E_EnumerationBase<enum TableEventEnum>
{
public:
E_TableEvent();
};
Este es el constructor
E_TableEvent::E_TableEvent()
{
state = NO_VALUE;
dictionary.insert("attract", ATTRACT);
dictionary.insert("open", OPEN);
dictionary.insert("closed", CLOSED);
}
El enlazador está lanzando este error:
e_tableevent.cpp:6: error: undefined reference to `E_EnumerationBase<TableEventEnum>::E_EnumerationBase()'
¿Se puede usar una enumeración como parámetro para una plantilla como esta?
"* El compilador arroja este error: *" No, el _linker_ está arrojando ese error. – ildjarn
¿Su definición de constructor está en el archivo de encabezado? – Lol4t0
No, la definición está en un archivo fuente separado. El error aparece en el enlace. – IslandCow