2017-08-13 99 views
0

gcc版本5.4.0(GCC)C++多重定義構造函數的錯誤消息似乎是錯誤的

> g++ -std=c++11 

在構建我得到一個類構造函數多重定義錯誤消息。當我刪除構造函數時,我得到一個未定義的符號錯誤消息。我很難過。

NodeClass::NodeClass(...)被標記爲

錯誤消息:

build/Debug/Cygwin64-Windows/nodeClass.o: In function `__gnu_cxx::new_allocator<std::string*>::~new_allocator()': 
/c/home/skidmarks/Projects/MPHASH/mphash/NodeClass.cpp:36: multiple definition of `NodeClass::NodeClass(std::vector<std::string*, std::allocator<std::string*> >&)' 

build/Debug/Cygwin64-Windows/NodeClass.o:/c/home/skidmarks/Projects/MPHASH/mphash/NodeClass.cpp:36: first defined here 

頭文件:

# include <vector> 
# include <gslip/SlipPointer.h> 

class NodeClass : public SlipPointer 
{ 
private: 
    vector<string*> vec; 
public: 
    NodeClass(vector<string*>& vec); 
    virtual ~NodeClass() { }; 
private: 
    NodeClass(const NodeClass& orig) { }; 
}; 

源碼:

# include <vector> 
# include "NodeClass.h" 

using namespace std; 
using namespace slip; 

NodeClass::NodeClass(vector<string*>& vec) : 
    SlipPointer(new string("Cluster Node")), vec(vec) {} 
+9

缺少標題包括警衛? – user0042

+0

這可能有幫助。 https://開頭計算器。COM /問題/ 12573816 /什麼 - 是 - 一 - 未定義參考懸而未決,外部符號錯誤和如何-DO-修復。 –

+0

@ user0042:守衛在那裏。 @ R Sahu:鏈接處理未定義的符號。這是一個雙重定義的符號。 –

回答

0

您尚未提供足夠的信息來確定您的編譯錯誤。我同意如果沒有足夠和適當的守衛,雙重定義可能會發生。你沒有表現出包括警衛,你的錯誤不是明顯在上面的代碼,


有2種類型的包括警衛。我曾見過使用過,但同時使用次數少。所有這些都是條件編譯命令的例子。

在名爲「NodeClass.h」,我的版本的頭後衛將有以下的第一2和最後一行(條件編譯的例子)頭文件:

#ifndef NODECLASS_H  // <--- header include guard 
#define NODECLASS_H  // <--- 
#include <vector> 
#include <gslip/SlipPointer.h> 

class NodeClass : public SlipPointer 
{ 
    private: 
     vector<string*> vec; 
    public: 
     NodeClass(vector<string*>& vec); 
     virtual ~NodeClass() { }; 
    private: 
     NodeClass(const NodeClass& orig) { }; 
}; 
#endif     // <--- 

在代碼文件中,名爲「NodeClass.cc」,我的第二版頭文件將包含類似的條件編譯語句。這在大多數環境中使用較少,我更喜歡上述情況。

#ifndef NODECLASS_H 
#include "NodeClass.h" 
#endif 
#include <vector>  // <-- redundant since also in header 

using namespace std; 
using namespace slip; 

NodeClass::NodeClass(vector<string*>& vec) 
    : SlipPointer(new string("Cluster Node")) 
    , vec(vec) 
{ 
} 
+0

先生那麼[這個答案](https://stackoverflow.com/a/14425299/2949645)? –

+1

爲什麼要測試.cc文件中的include guard? –

+0

@ M.M偏執?你沒有權限修改.h文件(政治?)你有命令這樣做(尖頭髮經理 - 我沒有遇到過,但我想他們確實存在)我的想象力讓我失望。 –

0

我懷疑你有這些功能在你的標題的線外定義。

初始化列表是構造函數定義的一部分,所以你需要在你定義構造函數的身體在同一個地方來定義它。這意味着你應該做的是在你的頭文件:

NodeClass(vector<string*>& vec) : 
    SlipPointer(new string("Cluster Node")), vec(vec) {} 

由於構造函數的定義並沒有在類定義內聯,編譯器不會使其隱含在線。現在,如果在多個翻譯單元(即* .cpp文件)中包含相同的文件,鏈接程序將產生與您看到的完全相同的錯誤,因爲每個* .cpp文件都將包含自己的構造函數定義,而不會標記它們作爲內聯函數。

替代簡單的解決方法就是把一個內聯的構造函數聲明的前面:

public: 
    inline NodeClass(vector<string*>& vec);