Problem mit templates



  • Hi,
    ich hab ein Problem, mit den Templates und Visual C++, ich versteh einfach nicht warum ich denn Fehler:

    Winsock error LNK2019: Nicht aufgeloestes externes Symbol "public: void __thiscall Network::Send(unsigned short *)" (?Send@Network@@QAEXPAG@Z), verwiesen in Funktion _main

    bei den unten angefügten Code bekomme:

    Network.h

    class Network
    {
    //gekürzt
        public:
            template<class T> void Send(T Data);
    };
    

    Network.cpp

    template <class T> void Network::Send(T Data)
    {
    	send(this->m_MainSocket.Get(), (char*)Data, sizeof(Data), 0);
    
    	return;
    }
    

    und dann in der main.cpp

    int main(void)
    {
    	//gekürzt
    
    	Network.Send(L"5");
    
    	return 0;
    }
    

    wenn ich statt Templates wchar_t nutze geht es, aber ich würd es gern mit templates machen, wo ist der Fehler?

    Danke schon mal im Voraus.

    Mfg
    Viets



  • Also meines Wissens nach müssen Deklaration und Implementation von Templates in eine Datei und dürfen nicht in getrennten Dateien stehen.



  • Das Problem ist ein anderes: Die Implementierung kann nicht instanziiert werden.

    Beispielslösung:

    class Network 
    { 
        void doSend(char *, size_t);
        public: 
            template<class T> void Send(const T &Data) { doSend((char *) &Data, sizeof(T)); }
    };
    


  • ich behaupte bashar hat recht.

    @MrN:
    ich bin gerade etwas blind, kannst du mal erklaeren warum das template nicht instanziiert werden kann?



  • Shade Of Mine schrieb:

    ich behaupte bashar hat recht.

    Danke, aber das ist zuviel der Ehre, ich hab hier ja noch gar nicht gepostet 🙂



  • :o

    da hab ich mich verlesen
    meinte natuerlich drakos

    (das kommt davon, wenn man mehrere threads gleichzeitig liest)



  • ch bin gerade etwas blind, kannst du mal erklaeren warum das template nicht instanziiert werden kann?

    Naja, dass Template kann nicht instanziiert werden, da der Compiler die Definition nicht sieht. Die liegt ja schön verborgen in einer cpp-Datei.

    Mir ist allerdings auch nicht klar, worauf genau Mr.N. mit seiner Implementation hinaus will.
    Die Aufspaltung von Send in Send und doSend hat löst das Problem freilich nicht. Das löst man nur, in dem man die Template-Definition überall dort sichtbar macht, wo sie verwendet wird. Sprich sie in den Header bzw. in eine Datei schreibt, die der Header dann inkludiert.


Anmelden zum Antworten