À l'aide d'une énumération comme un paramètre du modèle
Je voudrais utiliser un modèle de classe afin de fournir certaines fonctionnalités communes à certains enfants des classes qui sont très similaires. La seule variation est l'énumération que chacun utilise.
C'est la classe parent
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;
}
C'est l'un des enfants
enum TableEventEnum {
NO_VALUE = 0,
ATTRACT = 1,
OPEN = 2,
CLOSED = 3
};
class E_TableEvent : public E_EnumerationBase<enum TableEventEnum>
{
public:
E_TableEvent();
};
C'est le constructeur
E_TableEvent::E_TableEvent()
{
state = NO_VALUE;
dictionary.insert("attract", ATTRACT);
dictionary.insert("open", OPEN);
dictionary.insert("closed", CLOSED);
}
L'éditeur de liens est de lancer cette erreur:
e_tableevent.cpp:6: error: undefined reference to `E_EnumerationBase<TableEventEnum>::E_EnumerationBase()'
Une énumération être utilisée en tant que paramètre d'un modèle comme celui-ci?
"Le compilateur est en train de lancer cette erreur:" Non, le linker est en train de jeter l'erreur.
Est votre constructeur de définition dans le fichier d'en-tête?
Non, la définition est dans un autre fichier source. L'erreur s'affiche sur le lien.
Est votre constructeur de définition dans le fichier d'en-tête?
Non, la définition est dans un autre fichier source. L'erreur s'affiche sur le lien.
OriginalL'auteur IslandCow | 2012-02-02
Vous devez vous connecter pour publier un commentaire.
Les énumérations peuvent être des paramètres de modèle exactement de la même façon que les services de renseignements peuvent.
Mais vous simplement n'ont pas fourni une définition pour
E_EnumerationBase::E_EnumerationBase()
Ce n'est pas un problème à l'aide de modèles ou de l'héritage. C'est le même que si vous avez écrit ceci:
Pouvez-vous s'il vous plaît poster ideone.com ou similaire dans une forme telle que c'est la seule erreur? Il serait utile de voir les numéros de ligne etc. Pour l'instant, je ne crois pas que
public E_EnumerationBase<enum TableEventEnum>
compile à tous.est compile. Et les liens: ideone.com/Blaw9
Sont les énumérations dans les modèles traités comme des arguments valeur? Je voudrais l'utiliser comme un type.
Si vous voulez instantinate
Foo<typename T>
avecFoo<MyType>
c'est ok siMyType
est une classe ou enum ou de tout autre type. Vous pouvez également instantinateFoo<int N>
avecFoo<integer_contsant_expression>
et c'est aussi ok. À condition, évidemment, que la substitution de sens. Les implémentations ne devrait pas écrireif(i<T)
ouN value;
OriginalL'auteur spraff
La syntaxe va pour la valeur des arguments, comme c'est pour typename arguments. Fondamentalement, vous avez juste à remplacer
typename
avec le nom de votreenum
:"Ne pas écrire de graves modèle de code, sauf si vous sérieusement comprendre les modèles" - c'est un peu arrogant. Encourager le retour serait plus utile.
Il n'était pas prévu de cette façon, et vous avez raison. J'ai supprimé cette section tout à fait.
OriginalL'auteur Sebastian Mach
Vous ne pouvez pas déplacer définition de la fonction de modèle de fichier source séparé.
Là, il ne serait pas compilé à tous, parce que modèles ne peut pas être compilé, seules les instances de modèle peut.
Votre code dans un fichier distinct n'est pas compilé, c'est pourquoi vous avez réellement aucune définition pour
E_EnumerationBase<TableEventEnum>::E_EnumerationBase()
. C'est pourquoi vous obtenez de l'éditeur de liens d'erreur.Il suffit de déplacer tous les modèle de code à votre en-tête.
OriginalL'auteur Lol4t0
Juste pour la référence, comme vous semblez l'utilisation de Qt: Juste un coup d'oeil à
Q_ENUM
,QMetaEnum
etQMetaEnum::fromType
. Il peut être pratique pour initialiser votre dictionnaire.OriginalL'auteur Kamajii