"Instanciation implicite d'un modèle non défini" lors de la déclaration de la classe de modèle
J'ai un peu de code dans lequel j'ai besoin de déclarer la classe de modèle (ou au moins, avant de déclarer rendrait les choses beaucoup plus facile pour moi...). J'ai écrit une version simplifiée du problème, je vais avoir donc je peux l'afficher ici:
template<bool>
class MyTemplateClass;
int main( int argc, char* argv[] )
{
MyTemplateClass<false> myTemp; //error here
myTemp.GetTheValue();
return 0;
}
template<bool bShouldMult>
class MyTemplateClass
{
int m_myint;
float m_myfloat;
public:
MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {}
float GetTheValue()
{
return m_myint * (bShouldMult ? m_myfloat : 1.0f);
}
};
L'erreur que je reçois à la ligne de commentaire est:
Error - implicit instantiation of undefined template 'MyTemplateClass<false>'
Ce que les autres en détail ce que je dois inclure dans une déclaration anticipée de MyTemplateClass? Depuis que l'erreur ne vient pas de la ligne suivante vers le bas, je suis en supposant qu'elle n'est pas due au fait que la méthode n'est pas défini. Le compilateur que j'utilise est LLVM/CLang, et je suis compiler sur Mac.
source d'informationauteur benwad
Vous devez vous connecter pour publier un commentaire.
Pour déclarer une variable de n'importe quel type, modèle ou pas, l'ensemble de définition de ce type doit être disponible. Vous ne pouvez pas transférer la déclaration d'un modèle, puis commencer à l'utiliser comme si il ont été définis. Tout ce que vous pouvez faire à ce point est de déclarer un pointeur vers un objet d'un type basé sur le modèle, comme ceci:
Malheureusement (mais pas de façon inattendue) cela déplace l'erreur à la ligne suivante. Le problème de l'initialisation pointeur reste: une fois que vous essayez d'appeler
new MyTemplateClass<false>
vous verrez un message d'erreur.Vous avez besoin de ré-organiser votre code pour déplacer la définition du modèle en avance sur son lieu d'utilisation. Cela peut être un peu fastidieux, mais il n'y a pas moyen de contourner cela: le compilateur a besoin de l'ensemble de définition au moment où vous commencez l'instanciation de votre modèle et appeler ses méthodes.
Vous avez oublié de
#include
quelque chose?J'ai eu cette après oubli de
Lors de l'utilisation d'un
std::array
:^)
C'est à partir de ma compréhension que vous ne pouvez pas déclarer avant quelque chose et puis instancier dans votre pile (modèle ou pas).
Aussi je ne pense pas qu'il y a un très large soutien de l'avant de la définition de la classe de modèle