Templates, Linkerfehler und export



  • Danke, ich werds mal machen.
    Dev-C++ kennt export aber auch nicht. 🙄



  • Jetzt wirds strange.

    Datei_1.h:

    template<typename T>
    class Foo
    {
    	T bar;
    
    public:
    	Foo(const T& bar_);
    	~Foo();
    
    	T getBar() const;
    };
    
    template<typename T>
    T Foo<T>::getBar() const
    {
    	return bar;
    }
    
    template<typename T>
    Foo<T>::Foo(const T& bar_)
    : bar(bar_)
    {}
    
    template<typename T>
    Foo<T>::~Foo()
    {}
    

    Datei_1.cpp:

    #include <iostream>
    using namespace std;
    
    #include "Datei_1.h"
    
    int main()
    {
    	Foo<float> goo(4.5f);
    
    	cout << goo.getBar();
    
    	return 0;
    }
    

    Funktioniert.

    Wenn ich das mit meiner Template Klasse mache, dann schmeisst er einen Linkerfehler für jeden Memberfunktionsaufruf in main aus.



  • Jover schrieb:

    Jetzt wirds strange.

    Datei_1.h:

    template<typename T>
    class Foo
    {
    	T bar;
    
    public:
    	Foo(const T& bar_);
    	~Foo();
    
    	T getBar() const;
    };
    
    template<typename T>
    T Foo<T>::getBar() const
    {
    	return bar;
    }
    
    template<typename T>
    Foo<T>::Foo(const T& bar_)
    : bar(bar_)
    {}
    
    template<typename T>
    Foo<T>::~Foo()
    {}
    

    Datei_1.cpp:

    #include <iostream>
    using namespace std;
    
    #include "Datei_1.h"
    
    int main()
    {
    	Foo<float> goo(4.5f);
    
    	cout << goo.getBar();
    
    	return 0;
    }
    

    Funktioniert.

    Wenn ich das mit meiner Template Klasse mache, dann schmeisst er einen Linkerfehler für jeden Memberfunktionsaufruf in main aus.

    Edit: _Wow_: Wenn ich das mache was volkard vorgeschlagen hat, und es in VC++ 6 kompiliere gehts. 😮
    Dev-C++ hat sich beschwert.

    Edit2: Zu dumm zum editieren 🙄 🤡



  • Jover schrieb:

    Dev-C++ hat sich beschwert.

    Was sagt er denn?



  • Naja, Linkerfehler eben. Aber ich glaube, dass dieses Problem auf meine Unkompetenz zurückzuführen ist.
    Im VC++ ist es ja auch gegangen.

    Viel mehr würde es mich interessieren warum er das mit dem export nicht schluckt.
    VC++ interpretiert export z.B.: als globale Variable. 🙄

    Edit: Hier ein kleines Bsp:

    // Datei.h
    template<class T>
    class Foo
    {
    	T bar;
    
    public:
    	void setBar(const T& bar_);
    	T getBar() const;
    };
    
    // Datei.cpp
    #include "Datei.h"
    
    export template<class T>
    void Foo<T>::setBar(const T& bar_)
    {
    	bar = bar_;
    }
    
    export template<class T>
    T Foo<T>::getBar() const
    {
    	return bar;
    }
    
    // main.cpp
    #include <iostream>
    using namespace std;
    
    #include "Datei.h"
    
    int main()
    {
    	Foo<double> bar;
    
    	bar.setBar(123.456);
    
    	cout << bar.getBar();
    
    	return 0;
    }
    

    Das geht nicht. Hab ich nen Fehler gemacht?

    Edit2: Diese Fehler wirft er aus:

    D:\Programme\Microsoft Visual Studio\MyProjects\test\impl.cpp(3) : error C2143: Syntaxfehler : Fehlendes ';' vor ''template<''
    D:\Programme\Microsoft Visual Studio\MyProjects\test\impl.cpp(3) : error C2501: 'export' : Fehlende Speicherklasse oder Typbezeichner
    D:\Programme\Microsoft Visual Studio\MyProjects\test\impl.cpp(9) : error C2143: Syntaxfehler : Fehlendes ';' vor ''template<''
    D:\Programme\Microsoft Visual Studio\MyProjects\test\impl.cpp(9) : error C2501: 'export' : Fehlende Speicherklasse oder Typbezeichner
    D:\Programme\Microsoft Visual Studio\MyProjects\test\impl.cpp(9) : error C2086: 'export' : Neudefinition
    


  • Die template-Definition ist ja eigentlich class {...}, oder?
    Oder gilt das jetzt nur für normale Klassen?

    Egal, jedenfalls muss das, was es jetzt auch immer ist, von der cpp-Datei in die h-Datei, die cpp-Datei dazu darf gar nicht existieren. 🙂

    MfG MAV



  • export wird AFAIK nur vom Comeau Compiler unterstützt.



  • Heist das, dass ich bei einer Template Klasse alles in die .h, .hpp Datei schreiben muss? (Wenn ich z.B.: VC++ verwende)



  • wenn du zwei dateien hast (.h und .cpp) müssen beide in der main eingebunden werden.



  • cof schrieb:

    wenn du zwei dateien hast (.h und .cpp) müssen beide in der main eingebunden werden.

    Nein. Man bindet niemals eine .cpp-Datei ein, man gibt sie beim Linken mit an.

    Heist das, dass ich bei einer Template Klasse alles in die .h, .hpp Datei schreiben muss? (Wenn ich z.B.: VC++ verwende)

    Ja.


Anmelden zum Antworten