2012-01-19 59 views
1

所以,我必須具有功能實現在它以及原型的頭文件中。我現在試圖將這些實現從文件中分離出來,並留下原型,因爲我知道它沒有很好的標準來實現頭文件。但是,當我從頭文件中移除實現並將它們放在它們自己的cpp文件中,然後嘗試將該cpp文件鏈接到項目的其餘部分時,它會抱怨函數的多個定義。感謝您的任何幫助/建議C++多個定義

std::bitset<LENGTH> foo1(const std::string stringVal); 
std::bitset<LENGTH> foo2(const int decimalVal); 
std::string   foo3(const int integerVal); 

我有一個包括後衛,所以它不會被包括多次。

然後在CPP我只是有我對這些功能的實現只是簡單。然而它抱怨函數的多個定義,如果它們與頭文件分開的話。

編輯:我的一部分愚蠢的錯誤,這是解決。

+4

什麼是錯誤消息,什麼是挑釁錯誤消息的代碼? –

+0

您尚未提供足夠的信息來解答您的問題。請提供一個小例子,它至少顯示:(1)頭文件的內容,(2).cpp文件的內容,(3)鏈接器命令行。特別是'#include'行可能是最相關的。 –

回答

1

這只是一個聲明。即使該文件沒有包含警衛,也不會出現該錯誤。

多個定義通常意味着你定義在多個實現文件的功能。

這裏有一個清單:

  • 確保實現definetely頭之外。

  • 要保證在一個源文件定義的函數

  • 確保您不包括源文件(這個人是平凡的,我希望你知道不這樣做)

  • 最後,檢查你運行一個乾淨的版本

0

我想你不會編譯以前包含頭文件的其他cpp文件。所以對象文件仍然包含定義。順便說一句,在頭文件中沒有實現並不關乎很好的標準。這是必須的,以便您可以在多個編譯單元中包含相同的頭文件。

+2

實際上,如果方法是內聯或使用模板(在這種情況下,它是必需的),您可以在頭文件中實現。 –

+0

你是對的,我很抱歉,我只是想強調,這不是一個風格或標準的問題。無論哪種方式,這是必要的(即使在模板化函數的情況下,儘管在內聯的情況下您可以接受警告消息) – enobayram