Связывание класса шаблона с использованием другого класса шаблона (ошибка LNK2001) - PullRequest
0 голосов
/ 11 июня 2010

Я реализовал шаблон проектирования «Стратегия», используя абстрактный шаблон класса и два подкласса. Идет так:

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

и

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

Есть еще один подкласс, такой же, как этот, и alter реализован в файле cpp. Хорошо! Теперь я объявляю другой метод в другом классе (включая, конечно, neighbourhood заголовочный файл), например:

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

Компилируется нормально и чисто. При начале ссылки я получаю следующую ошибку:

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)" (?alter@?$Neighbourhood@VLotSolutionInformation@@@lsc@@UAEXAAV?$vector@VLotSolutionInformation@@V?$allocator@VLotSolutionInformation@@@std@@@std@@HH@Z)

Ответы [ 2 ]

3 голосов
/ 11 июня 2010

Есть еще один подкласс, такой же, как этот, и изменить это реализовано в файл cpp.

Не могу сделать - это должно быть в шапке.

0 голосов
/ 11 июня 2010

Кажется, это была довольно грубая ошибка.Поскольку Neighborhood является абстрактным классом, я должен всегда использовать его как указатель ( EDIT : или как ссылку), поскольку он никогда не должен создаваться.

Изменены подписи, и все заработало.

РЕДАКТИРОВАТЬ : Кроме того, благодаря Нейлу, я знаю, что "оно должно быть в заголовке".

...