gcc bug mit templates?
-
//CONSOLE.HPP #include <iostream> //die defines sind zwar nicht falsch, aber wenn man mal dabei ist... enum states{ LOG_ERROR, LOG_SUCCESS, LOG_PROGRESS }; void prepare(states id); template<class T> void logger(T output,states id=LOG_ERROR) { prepare(id); std::cout<<output<<std::endl; }
//CONSOLE.CPP #include "console.hpp" using namespace std; void prepare(states id) { switch (id) { case LOG_ERROR: { cout<<"ERROR: "; break; } case LOG_SUCCESS: { cout<<"SUCCESS: "; break; } case LOG_PROGRESS: { cout<<"PROGRESS: "; break; } } }
//main.cpp #include "console.hpp" using namespace std; int main(int argc,char** argv) { logger("Test"); cin.get(); return 0; }
so funktionierts... erklärung siehe meinen ersten post.
-
so funktionierts eben nicht, und das ist das problem!
[Linker error] undefined reference ...
übrigens: danke für den tipp mit dem enum. mit dem kenne ich mich noch nicht so gut aus
-
hab nochmal editiert. mein gcc schluckt das so
-
das ist interessant... also ich benutze version 3.4.2 mit dev-c++ 4.9.9.2 (der gcc-compiler lag bei der beta-version mit bei) <-- kann das daran liegen (an der version)
-
Wie sieht deine .hpp genau aus, nachdem du otzes vorschlag reinkopiert hast? Und wie ist die Fehlermeldung genau?
-
updates für den mingw
-
@ponto:
console.hpp:#include <iostream> #define LOG_ERROR 1 #define LOG_SUCCESS 2 #define LOG_PROGRESS 3 void prepare(int id); template<class T> void logger(T output,unsigned short id = 0) { prepare(id); std::cout<<output<<endl; }
und das steht im kompilier log von dev-c++:
Compiler: Default compiler Building Makefile: "D:\Sicherung\Makefile.win" Führt make... aus make.exe -f "D:\Sicherung\Makefile.win" all g++.exe console.o main.o -o "Projekt1.exe" -L"C:/Dev-Cpp/lib" main.o(.text+0x13a):main.cpp: undefined reference to `void logger<char const*>(char const*, unsigned short)' collect2: ld returned 1 exit status make.exe: *** [Projekt1.exe] Error 1 Ausführung beendet
@otze: aber der 3.4.2 dürfte doch der neueste sein, oder nicht?
-
Hast du ein make clean gemacht? Lösch mal alle .o Dateien
-
habe alle .o's gelöscht, mehrmals
-
Lars Hupel schrieb:
habe alle .o's gelöscht, mehrmals
zeig das compile log, dass er wirklich alles kompiliert. in deinem letzten beispiel (dass übrigens nicht (alle) änderungen von otze drin hat) wird nämlich nicht alles kompiliert.
-
Ich seh in deinem Log aber nicht, dass er die .o Dateien neu macht.
-
jetzt weiß ich, woran es lag: ich musste die makefile löschen... wie soll man denn auf so etwas kommen? gibts dafür ne logische erklärung?
ps: danke, ihr seit spitze...
wäre fast verzweifelt