PDA

Tam Sürümünü Görmek İçin : templeyt uyuzluğu


sckz
15/07/2005, 06:39
şimdi bi proje altında üç tane dosyamız olsun.. bunlar main.cpp, MyHeader.h, birde MySource.cpp.. kodları da aşağıdaki gibi :
main.cpp :
#include "MyHeader.h"

int main()
{
gonul(5);
return 0;
}
MyHeader.cpp :
void gonul(int);
MySource.cpp :
#include <iostream>
void gonul(int a)
{
std::cout << "sckz" << std::endl << a;
}

yukaridaki projeyi derlediğimde gül gibi çalışıyor...
sonra olaya template katayım diyorum.. doğal olarak hata alıyorum..

yukarıdaki dosyalari şu şekilde değiştiriyorum :
main.cpp :
#include "MyHeader.h"

int main()
{
gonul(5);
return 0;
}
MyHeader.h :
template <class T>
void gonul(T a);
MySource.cpp :
#include <iostream>
template <class T>
void gonul(T a)
{
std::cout << "sckz" << std::endl << a;
}

ama bunu çalıştırmak istediğimde msvc bana "birdenFazla1 error LNK2019: unresolved external symbol "void __cdecl gonul<int>(int)" (??$gonul@H@@YAXH@Z) referenced in function _main
" diyor...

burda muhtemelen MySource dan oluşturulan .obj dosyasının içinde bu şablonun int için örneklenmişi yok (aslında hiçbi veri için örneklenmiş hali yok).. dolayısıyla ben bu hatayı alıyorum (derleyici müneccim değil ya, nerden bilsin benim gonul<int>() fonksiyonunu kullanacağımı)..

sormak istediğim standart container lar harici bir dosyada olduğu halde, ve şablon sınıfları kullanarak gerçeklendiği halde, onlar bu yeteneğe sahip.. demekki birşekilde yapılabiliyormuş.. o zaman ben nasıl yapabilirim (main.cpp de #include "MySource.cpp" yazınca sorunsuz çalışacağını bende biliyorum. ama istediğim bu değil)..


acehreli
15/07/2005, 07:07
Sablon kodlarinin orneklendikleri (instantiate edildikleri) yerde gorulmesi gerekir. Onun icin gonul islevinin tanimini MyHeader.h basligi icine tasiman gerekir.

Standart topluluklar da oyledir aslinda. Eger <vector> basliginin icine baktiginda vector islemlerinin kodlarini goremiyorsan, bunun nedeni <vector>un baska basliklar ekliyor olmasi olabilir:

#include <vector_islemleri.h>

gibi...

Ali