2010-01-17 75 views
6

我在頭文件中有以下內容。對非成員函數的未定義引用 - C++

namespace silc{ 
    class pattern_token_map 
    { 
     /* Contents */ 
    }; 

    pattern_token_map* load_from_file(const char*); 
} 

在CPP文件(這已得到妥善包括)

pattern_token_map* load_from_file(const char* filename) 
{ 
    // Implementation goes here 
} 

在另一個CPP文件。這已經得到了所有適當的包括。

void some_method() 
{ 
    const char* filename = "sample.xml"; 
    pattern_token_map* map = load_from_file(filename); // Linker complains about this. 
} 

我得到一個鏈接錯誤說未定義的引用load_from_file。我無法看到這裏出了什麼問題。

任何幫助,將不勝感激。

編譯器:G ++ OS:Ubuntu 9.10的

編輯

這裏是用於連接器的命令。

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out src/phonetic_kit/pattern_token_map.o tests/pattern_token_map_tests.o tests/main.o -lUnitTest++ 

誤差是pattern_token_map_tests.o和功能在pattern_token_map.o可用。所以我猜想鏈接的順序不會造成問題。 (我已經從命令中刪除了一些文件來簡化它)

+0

你失蹤'some_method'的括號? – 2010-01-17 17:31:58

+1

不可能從您發佈的內容中知道 - 請添加您正在使用的編譯器/鏈接器命令。 – 2010-01-17 17:34:41

+0

謝謝尼爾。我已經添加了我正在使用的鏈接器命令。這是我所擁有的簡化版本。 – 2010-01-17 17:36:50

回答

9

當你實現它,你必須確保你實施正確的功能:

namespace silc { 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 
} 

如果不是這樣做:

using namespace silc; // to get pattern_token_map 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 

然後你會定義一個新功能而不是silc :: load_from_file。

避免使用指令(「用命名空間...;」)的功能範圍之外,作爲一般準則:

using namespace silc; // outside function scope: avoid 

silc::pattern_token_map*      // qualify return type 
random_function(silc::pattern_token_map* p) { // and parameters 
    using namespace silc; // inside function scope: fine 
    pattern_token_map* p2 = 0; // don't have to qualify inside the function 
          // if you want to use the using directive 
    silc::pattern_token_map* p3 = 0; // but you can always do this 
    return 0; 
} 
+0

謝謝。通過說「避免在函數之外使用指令(」使用名稱空間...;「),」你的意思是避免將它寫在cpp文件之上。代之以寫入每個函數。這是你的意思嗎? – 2010-01-17 18:01:07

+1

是的,如果你想在一個函數中使用它,那很好。反正你很少需要它,因爲你可以在我的第一段代碼中使用表單來在cpp文件中實現你的函數。 – 2010-01-17 18:19:18

+1

我沒有想過在函數體內限制'using'指令。 +1 – 2010-01-17 18:27:10

0

在你的鏈接階段,你是否鏈接了通過編譯第一個cpp文件而創建的目標文件?當一個對象引用一個未包含在被鏈接的對象中的符號時,會出現類似這樣的鏈接器錯誤。

編輯:我仍然有理由相信這是問題所在。在第一個文件中,是否有預處理器符號重新定義load_from_file?

+0

是的。我鏈接所有的對象文件。添加了鏈接器命令。請看一看。 – 2010-01-17 17:38:20