PDA

View Full Version : مشکل با template



kia.celever
یک شنبه 12 تیر 1390, 15:58 عصر
سلام من میخواستم یه template class بنویسم که تو خودش یه نوع داده نامشخص رو نگه دارم اما کد زیر به من link error میده. کسی میتونه بگه اشکال کارم کجاست؟
در ضمن از Ubuntu 10.04 و کامپایلر g++ استفاده میکنم.
MyClass.h
#ifndef _MYCLASS_H
#define _MYCLASS_H
template<class T> class MyClass {
T value;
public:
MyClass(T v);
~MyClass();
};
#endif // _MYCLASS_H
MyClass.cpp
#include "MyClass.h"
template<class T> MyClass<T>::MyClass(T v) {
value = v;
}
template<class T> MyClass<T>::~MyClass() {

}
main.cpp
#include "MyClass.h"
int main() {
MyClass<int> test(10);
return 0;
}
Make output

g++ main.cpp -c
g++ MyClass.cpp -c
g++ main.o MyClass.o -o Out
main.o: In function `main':
main.cpp:(.text+0x1a): undefined reference to `MyClass<int>::MyClass(int)'
main.cpp:(.text+0x2b): undefined reference to `MyClass<int>::~MyClass()'
collect2: ld returned 1 exit status
make: *** [all] Error 1

_hamid
دوشنبه 17 مرداد 1390, 12:24 عصر
کدتون درسته. فقط درست لینک نمی کنید.
یه ذره بیشتر بگرد. نوع لینک کردن با این کامپایلر رو بخون.
من خودم یادم رفته :دی

simul8or
سه شنبه 18 مرداد 1390, 05:22 صبح
مشکل این است که uninstantiated template definitions are not put into object (.obj) files .
بنابر این باید به طور صریح یک instant از template بسازید و به آخر فایل MyClass.cpp اضافه کنید:
template MyClass<int>;
بنابر این فایل شما می شود:

#include "MyClass.h"
template<class T> MyClass<T>::MyClass(T v) {
this->value = v;
}
template<class T> MyClass<T>::~MyClass() {

}

template MyClass<int>;