Witam, mam pewien bardzo dziwny problem którego nie potrafię zwalczyć. Z góry mam narzuconą prace w M$ Visual C++ . Napotkałem taki problem:
Mam pliki:
C_SystemOperation.h
#ifndef C_SystemOperation_h
#define C_SystemOperation_h
#include <string>
#include <sstream>
using namespace std;
class C_SystemOperation {
public:
template <class T>
T StringToType(std::string Arg);
};
#endif
C_SystemOperation.cpp
#include "C_SystemOperation.h"
template <class T>
T C_SystemOperation::StringToType(string Arg){
T out;
std::istringstream iss(Arg);
iss >> out;
return out;
}
main.cpp
#include "stdafx.h"
#include "C_SystemOperation.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
C_SystemOperation ob;
ob.StringToType<int>("13");
return 0;
}
(Oczywiście kod okrojony do minimum dla testów)
Kiedy próbuję skompilować (nawet w świeżym projekcie) taki kod, wyskakuje mi błąd linkera:
error LNK2019: unresolved external symbol "public: int __thiscall C_SystemOperation::StringToType<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??$StringToType@H@C_SystemOperation@@QAEHV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _wmain
I szczerze mówiąc nie mam pojęcia co może być źle, z uwagi gdy wrzucę cały kod do samego main.cpp, czyli:
#include <string>
#include <sstream>
using namespace std;
class C_SystemOperation {
public:
template <class T>
T StringToType(std::string Arg);
};
template <class T>
T C_SystemOperation::StringToType(string Arg){
T out;
istringstream iss(Arg);
iss >> out;
return out;
}
int _tmain(int argc, _TCHAR* argv[])
{
C_SystemOperation ob;
ob.StringToType<int>("13");
return 0;
}
Kompilacja przebiega bez najmniejszego mru mru... Czy ktoś byłby na tyle uprzejmy, by poświęcić swój czas i wytłumaczyć to łopatologicznie?
Pozdrawiam.
satirev