2015-04-06 90 views
0

編譯C++程序時,我有一個「未定義的引用」錯誤。我知道這是常見的陷阱,但到目前爲止無法弄清楚我做錯了什麼。C++'未定義的引用'錯誤

下面是相關的代碼。 Ex1Two_Sum.h:

#ifndef EX1TWO_SUM_H 
#define EX1TWO_SUM_H 

#include <vector> 
using namespace std; 

namespace ddc { 
class Ex1Two_Sum 
{ 
    public: 
    void f(); 
    protected: 
    private: 
}; 
} 

#endif 

Ex1Two_Sum.cpp:

#include <vector> 
#include <cstddef> 
#include <iostream> 

using namespace std; 

namespace ddc { 
class Ex1Two_Sum { 
public: 

    void f(){ 
    cout << "works" << endl; 
    } 
}; 
} 

最後,main.cpp中:

#include <iostream> 
#include "Ex1Two_Sum.h" 

using namespace std; 
using namespace ddc; 

int main() 
{ 
    Ex1Two_Sum ex1; 
    ex1.f(); 
    return 0; 
} 

我編譯如下:

g++ -std=c++11 -c Ex1Two_Sum.cpp 
g++ -std=c++11 -c main.cpp 
g++ Ex1Two_Sum.o main.o 

產生的以下信息:

main.o: In function `main': 
main.cpp:(.text+0x2c): undefined reference to `ddc::Ex1Two_Sum::f()' 
collect2: error: ld returned 1 exit status 

回答

4

當源文件僅僅需要提供非內聯函數定義時,您的源文件會重新定義整個類,並帶有內聯函數定義。

#include "Ex1Two_Sum.h" 

void ddc::Ex1Two_Sum::f() { 
    std::cout << "should work\n"; 
} 

此外,請不要將using namespace std;放在標題中。不是每個人都想要在potentially surprising方式中受到污染的全局命名空間。

+0

呀。現在工作 - 需要包含iostream進行編譯。在一個相關的說明:你會說這是通常的方式來定義/使用類的c + +?我的意思是,在.h文件中有類規範,然後是一個單獨的文件來簡單地實現函數? – nmpg 2015-04-06 13:56:42

+0

@nmpg:是的,這是通常的做法。另一種方法是將其全部定義在頭文件中,這有時是合適的(定義模板時通常需要),但可能導致過度的依賴關係。 – 2015-04-06 16:02:28

0

首先,命令的哪一行會引發該錯誤?

其次,我想你在Ex1Two_Sum.cpp

三忘了包括Ex1Two_Sum.h你需要Ex1Two_Sum.cpp來改變class .......

void Ex1Two_Sum::f(){...}