includes



  • Hi : )
    Also ich habe eine Klasse (Tmatrix), die (mehr oder weniger) in 2 Dateien aufgeteilt ist:
    matrix.hpp, matrix.cpp

    die *.hpp habe ich in der main-datei included (und benutzt) - die *.cpp extra noch dem Projekt hinzugefügt - obwohl ich includeguards etc habe, sagt er mir jz immer, dass er nen paar Funktionen (die in der *.hpp genutzt werden), schon kennt...

    main.cpp:

    #include "Matrix\\matrix.hpp"
    using my::math::Tmatrix;
    int main (int argc, char *args[])
    	{
    //....
    	}
    

    matrix.hpp:

    #ifndef MY_MATRIX_DEFINE
    #define MY_MATRIX_DEFINE
    
    #define _SECURE_SCL 0
    #pragma warning (disable:4290) //warns about throw (T)
    
    #include <iterator>
    #include <iostream>
    #include <vector>
    
    #include "Exceptions\\exceptions.hpp"
    #include "ToInt\\toint.hpp"
    
    namespace my
    	{
    		namespace math
    			{
    				template <typename T>
    					class Tmatrix
    						{//...
    							friend std::ostream& operator << (std::ostream &stream, const Tmatrix &matrix)
    									{
    										std::string out ("");
    										const std::vector <std::vector <T> >::const_iterator end1 (matrix.Cells.end ());
    										std::vector <T>::const_iterator end2;
    										for (std::vector <std::vector <T> >::const_iterator iter1 (matrix.Cells.begin ()); iter1 != end1; ++iter1)
    											{
    												out += "[\t";
    												end2 = iter1->end ();
    												for (std::vector <T>::const_iterator iter2 (iter1->begin ()); iter2 != end2; ++iter2)
    													{
    														out += ::my::convert::ToString <T> (*iter2); //die Funktion - siehe unten...
    														out.push_back ('\t');
    													}
    												out += "]\r\n";
    											}
    										stream << out << std::endl;
    										return stream;
    									}
    
    						};
    

    matrix.cpp (hier is (noch) nichts drin, weil bis jetzt alles templates sind und VS extport ja (noch 😉 ) nich unterstützt):

    #include "matrix.hpp"
    
    #pragma warning (disable:4290)
    
    namespace my
    	{
    		namespace math
    			{
    				//nothing up to now
    			};
    	};
    
    #pragma warning (default:4290)
    

    die converter-Funktion:

    //namespace my, namespace convert
    
    template <typename T>
    	std::string ToString (const T &in) {/*...*/};
    
    template < >
    	std::string ToString <unsigned char> (const unsigned char &value) {/*...*/};
    
    template < >
    	std::string ToString <signed char> (const signed char &value) {/*...*/};
    
    //die beiden char fkt extra noch mal, damit ich Zahlen und keine Sybole sehe
    

    Die Fehlermeldung an sich:

    1>matrix.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl my::convert::BoolToStr(bool)" (?BoolToStr@convert@my@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) ist bereits in main.obj definiert.
    1>matrix.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl my::convert::ToString<unsigned char>(unsigned char const &)" (??$ToString@E@convert@my@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABE@Z) ist bereits in main.obj definiert.
    1>matrix.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl my::convert::ToString<signed char>(signed char const &)" (??$ToString@C@convert@my@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABC@Z) ist bereits in main.obj definiert.
    

    Was die VS-Hilfe dazu sagt:

    Dieser Fehler kann eine der folgenden Ursachen haben:
    1. Die Kombination statischer und dynamischer Bibliotheken bei gleichzeitiger Verwendung von /clr.
    
    2. Das Symbol ist eine Paketfunktion (wird durch die Kompilierung mit /Gy erstellt) und befindet sich in mehr als einer Datei, es wurde jedoch zwischen den Kompilierungen geändert. Kompilieren Sie alle Dateien neu, die Symbol enthalten.
    
    3. Das Symbol wurde in zwei Memberobjekten in verschiedenen Bibliotheken unterschiedlich definiert, und beide Memberobjekte wurden verwendet.
    
    4. Ein absolutes Symbol wurde zweimal definiert, in jeder Definition mit einem anderen Wert.
    
    5. In einer Headerdatei wurde eine Variable deklariert und definiert. Folgende Lösungen sind möglich:
        Deklarieren Sie die Variable in der H-Datei: extern BOOL MyBool; nehmen Sie dann Zuweisungen in einer C- oder CPP-Datei vor: BOOL MyBool = FALSE;.
        Deklarieren Sie die Variable als static.
        Deklarieren Sie die Variable als selectany.
    
    6. Bei Verwendung von uuid.lib in Kombination mit anderen LIB-Dateien, durch die GUIDs definiert werden (z. B. oledb.lib und adsiid.lib).
    

    Danke schon mal : )



  • ok - nachdem ich jetzt noch weiter gesucht habe, hab ich iwo gelesen, dass man nen inline vor die jeweiligen funktionen packen muss - aber wozu eigtl?
    naja - es funtzt jz jedenfalls : D



  • unskilled schrieb:

    ok - nachdem ich jetzt noch weiter gesucht habe, hab ich iwo gelesen, dass man nen inline vor die jeweiligen funktionen packen muss - aber wozu eigtl?
    naja - es funtzt jz jedenfalls : D

    Das musst du nicht unbedingt. Inline gibt lediglich einem Compiler den Hinweis, dass man das gerne Inline haben will, anstatt einem Funktionsaufruf. Eigentlich sollte jede Funktion, die Inline funktioniert auch nicht Inline gehen.


Log in to reply