Использую Visual Studio 2005. Проблема такая: создал шаблон класса список. В класс включил функцию упорядочивания списка. Пишу консольную программу, для тестирования класса. Даю команду Build и получаю ошибку линкера:
unresolved external symbol "public: void __thiscall ListTpl<int>::LstOrder(void)" (?LstOrder@?$ListTpl@H@@QAEXXZ) referenced in function _main
1>C:\Programming\Visual Studio 2005\Projects\LstConcat\Debug\LstConcat.exe : fatal error LNK1120: 1 unresolved externals...
Вроде все заголовочные файлы включены.
Попробовал реализацию функции вставить в заголовочный файл - все нормально работает. Может дело в настройках проекта? Где-то надо дать команду линкеру включить файл реализации класса? Но где? Я не силен в настройках проекта Visual Studio.
Содержимое заголовочного файла класса такое:
#include<iostream>
#include "NodeTpl.h"
using namespace std;
template<class T>
class ListTpl {
public:
ListTpl():head(NULL) { };
ListTpl( const T& first ) { head=new NodeTpl<T>*(first, NULL); };
void addHead( const T& data) { head=new NodeTpl<T>(data, head); };
void insert(const T& data, NodeTpl<T>* afterme) {
afterme->setlink(new NodeTpl(data, (afterme->getlink());); );
}
void delNode(NodeTpl<T>* afterme) {
NodeTpl<T>* toDel=(afterme->getlink(););
afterme->setlink(toDel->getlink(););
delete toDel;
}
void showLst() {
NodeTpl<T>* current=head;
while(current!=NULL) {
cout<<(current->getdata())<<endl;
current=(current->getlink());
};
}
void LstOrder(); /* {
NodeTpl<T>* tmp1=head;
while(tmp1!=NULL) {
NodeTpl<T>* tmp2=tmp1->getlink();
//NodeTpl<T>* before=tmp1;
while(tmp2!=NULL) {
if((tmp1->getdata())>(tmp2->getdata())) {
T olddata=tmp1->getdata();
tmp1->setdata(tmp2->getdata());
tmp2->setdata(olddata);
};
tmp2=tmp2->getlink();
};
tmp1=tmp1->getlink();
};*/
NodeTpl<T>* findNode(T& toFind, NodeTpl<T>* head);
private:
NodeTpl<T>* head;
};
Реализация функции LstOrder тут закомментирована. Если ее раскомментировать все заработает.
А файл реализации класса:
#include "ListTpl.h"
template<class T>
NodeTpl<T>* ListTpl<T>::findNode(T& toFind, NodeTpl<T>* head) {
NodeTpl<T>* curr=head;
while(curr!=NULL) {
if((curr->getdata();)==toFind) return curr;
curr=curr->getlink();
};
return NULL;
}
template<class T>
void LstOrder() {
NodeTpl<T>* tmp1=head;
while(tmp1!=NULL) {
NodeTpl<T>* tmp2=tmp1->getlink();
//NodeTpl<T>* before=tmp1;
while(tmp2!=NULL) {
if(tmp1>tmp2) {
T olddata=tmp1->getdata();
tmp1->setdata(tmp2->getdata(););
tmp2->setdata(olddata);
};
tmp2=tmp2->getlink();
};
tmp1=tmp1->getlink();
};
}
В тестовой программе эта функция вызывается так:
#include<iostream>
#include "ListTpl.h"
using namespace std;
int main() {
......
//Создаем экземпляр класса и инициализируем его
.....
Mylist.showLst();
cout<<"Упорядочиваем!"<<endl;
Mylist.LstOrder();
cout<<"Получили: "<<endl;
Mylist.showLst();
...
Подскажите, в чем проблема? Может дело в опциях линкера?