2010-06-11 3 views
0

J'ai implémenté le modèle de conception "Stratégie" à l'aide d'une classe de modèle abstrait et de deux sous-classes. Il en va comme ceci:Liaison d'une classe de modèle à l'aide d'une autre classe de modèle (erreur LNK2001)

template <class T> 
class Neighbourhood { 
public: 
    virtual void alter(std::vector<T>& array, int i1, int i2) = 0; 
}; 

et

template <class T> 
class Swap : public Neighbourhood<T> { 
public: 
    virtual void alter(std::vector<T>& array, int i1, int i2); 
}; 

Il y a une autre sous-classe, comme celui-ci, et alter est implémenté dans le fichier cpp. OK bien! Maintenant, je déclare une autre méthode, dans une autre classe (y compris le fichier d'en-tête neighbourhood, bien sûr), comme ceci:

void lSearch(/*parameters*/, Neighbourhood<LotSolutionInformation> nhood); 

Il compile bien et proprement. Lorsque vous commencez à créer un lien, je reçois l'erreur suivante:

1>SolverFV.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall lsc::Neighbourhood<class LotSolutionInformation>::alter(class std::vector<class LotSolutionInformation,class std::allocator<class LotSolutionInformation> > &,int,int)" ([email protected][email protected]@@@[email protected]@[email protected]@@[email protected]@@@[email protected]@@[email protected]@[email protected]) 

Répondre

0

Il semble que ce fut une erreur assez novice. Puisque Neighborhood est une classe abstraite, je dois toujours l'utiliser comme un pointeur (EDIT: ou une référence), car il ne doit jamais être instancié.

Les signatures ont été modifiées et cela a fonctionné correctement.

EDIT: Aussi, grâce à Neil, je sais que "ça doit être dans l'en-tête".

+1

En fait, vous pourriez préférer utiliser des références à Neighbourhood au lieu de pointeurs. –

+0

Je voudrais upvote s'il ne disait pas que vous devez utiliser des pointeurs. Qu'est-ce que @Luc dit –

+0

Merci à vous deux :) –

3

There's another subclass, just like this one, and alter is implemented in the cpp file.

ne peut le faire - il faut que ce soit dans l'en-tête.

+1

Oh, ouais, ça aussi. Puisque le C++ est parfait pour une foule de choses, j'avais même oublié comment il aspirait en tant que langage OO ...:/ –

Questions connexes