2012-04-13 9 views
1

Ich habe mehrere verwandte Beiträge, aber kein Glück mit diesem Fehler angesehen. Ich erhalte diese undefinierte Referenz Fehlermeldung unten, wenn mein Namespace über mehrere Dateien hinweg existiert. Wenn ich nur ConsoleTest.cpp mit Inhalt von Console.cpp kompiliere kompiliert die Quelle kompiliert."undefined Referenz" Fehler mit Namespace über mehrere Dateien

Ich würde mich über jedes Feedback zu diesem Thema freuen, danke im Voraus.

g++ Console.cpp ConsoleTest.cpp -o ConsoleTest.o -Wall 

/tmp/cc8KfSLh.o: In function `getValueTest()': 
ConsoleTest.cpp:(.text+0x132): undefined reference to `void Console::getValue<unsigned int>(unsigned int&)' 
collect2: ld returned 1 exit status 

Console.h

#include <iostream> 
#include <sstream> 
#include <string> 

namespace Console 
{ 
    std::string getLine(); 

    template <typename T> 
    void getValue(T &value); 
} 

Console.cpp

#include "Console.h" 

using namespace std; 

namespace Console 
{ 
    string getLine() 
    { 
     string str; 
     while (true) 
     { 
      cin.clear(); 
      if (cin.eof()) { 
       break; // handle eof (Ctrl-D) gracefully 
      } 

      if (cin.good()) { 
       char next = cin.get(); 
       if (next == '\n') 
        break; 
       str += next; // add character to string 
      } else { 
       cin.clear(); // clear error state 
       string badToken; 
       cin >> badToken; 
       cerr << "Bad input encountered: " << badToken << endl; 
      } 
     } 
     return str; 
    }    


    template <typename T> 
    void getValue(T &value) 
    { 
     string inputStr = Console::getLine(); 
     istringstream strStream(inputStr); 

     strStream >> value; 
    } 
} 

ConsoleTest.cpp

#include "Console.h" 

void getLineTest() 
{ 
    std::string str; 

    std::cout << "getLinetest" << std::endl; 

    while (str != "next") 
    { 
     str = Console::getLine(); 
     std::cout << "<string>" << str << "</string>"<< std::endl; 
    } 
} 

void getValueTest() 
{ 
    std::cout << "getValueTest" << std::endl; 
    unsigned x = 0; 
    while (x != 12345) 
    { 
     Console::getValue(x); 
     std::cout << "x: " << x << std::endl; 
    } 
} 

int main() 
{ 
    getLineTest(); 
    getValueTest(); 
    return 0; 
} 

Antwort

2

Die Template-Funktion definiert werden muss, nicht nur erklärt, in die Überschrift. Der Compiler muss die Template-Implementierung und das Template-Argument sehen, um die Spezialisierung zu erstellen, die Sie in Ihrem main benötigen. Also setze die Definition in die Kopfzeile direkt:

+0

Vielen Dank für deine schnelle Antwort Juancho, es wird mir weiter helfen. Alles Gute. – user1330734