2010-08-22 69 views
3

我在我的代碼是這樣的:奇怪的多重定義錯誤

namespace A { 
namespace B { 

void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

我也得到多重定義錯誤,每當我打電話A::B::GetLine。任何想法爲什麼? (代碼在工作,所以如果你需要更多的信息,我會試着給出特定的代碼片段,但是我不能只在這裏修改整個代碼)。

+0

你不能發佈編譯器錯誤信息嗎?也許它會暗示我們不在上面的代碼片段中。 – David 2010-08-22 12:13:50

+2

您是否嘗試多次鏈接目標文件?看看你的makefile,看看包含這個函數的.o是否被多次傳遞給編譯器。我假設你使用的是unix或unix系統,但是你可以做的另一件事是在所有目標文件上運行「nm --demangle」並搜索A :: B :: GetLine以查看它是否在多個.o文件中顯示爲「已定義」。 – George 2010-08-22 12:14:40

+0

nm爲+1 --demangle – Chubsdad 2010-08-22 12:32:44

回答

4

您幾乎可以肯定地將代碼包含在多個頭文件中,而不是在頭文件中聲明並在源文件中定義。您需要內聯聲明函數,對其進行模板化,或將定義移動到源文件中,但將聲明留在標題中。

+0

非常簡單...謝謝! – 2010-08-22 12:29:23

1

您的問題是,您可能在.h文件中包含此代碼並將其包含到更多的.cpp文件中。的解決方案是使用inline關鍵字使編譯器內聯,然後卸下參考:

namespace A { 
namespace B { 

inline void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

另一個解決方案是方法體移動到cpp文件。