2012-04-13 4 views
1

私はいくつかの関連する投稿を見てきましたが、このエラーは運がありません。 私の名前空間が複数のファイルにまたがっている場合は、この未定義の参照エラーメッセージが表示されます。 ConsoleTest.cppのみをコンパイルしてConsole.cppの内容をダンプすると、ソースはコンパイルされます。複数のファイルに名前空間を持つ "未定義の参照"エラー

この問題に関するご意見は、お寄せいただきありがとうございます。

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; 
} 

答えて

2

テンプレート関数はでは、宣言されていないだけで、定義する必要がありますヘッダーコンパイラは、メインフレームで必要とする特殊化を構築するために、テンプレート実装とテンプレート引数を参照する必要があります。したがって、ヘッダーの定義を直接ヘッダーに入れてください。

namespace Console 
{ 
    std::string getLine(); 

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

    } 
} 
+0

あなたの迅速な対応に感謝します。ではごきげんよう。 – user1330734

関連する問題