Problem z linkerem w M$ Visual i szablonem funkcji

0

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.

1

umieść ciało funkcji szablonowej w pliku .h.
visual nie jest winny. to C++ jest… zepsuty.

0

meh meh smutne trochę, dzięki za wyjaśnienie.

0

Rozwiązań jest kilka:

  • dodaj do deklaracji szablonu w pliku nagłówkowym specyfikator export
  • ukonkretyzuj szablon
  • includnij plik *cpp w pliku gdzie uzywasz obiektów szablonowych

1 użytkowników online, w tym zalogowanych: 0, gości: 1