2012-08-30 55 views
0

我寫了一段使用複雜庫的代碼。我把我的函數的定義放在一個頭文件和main.cpp中,我已經定義了複數「I」,你可以在我的代碼中看到。 但是,當我想編譯此代碼我收到錯誤。如何在頭文件中使用複雜的庫?

我覺得頭文件中的函數不能使用複雜的庫。 我該如何解決這個問題?

謝謝。

的main.cpp

#include <iostream> 
#include "math.h" 
#include <complex> 
#include "header.h" 

using namespace std; 
typedef complex<double> cmp; 
cmp I(0.0,1.0); 

int main() 
{ 
cout << function(5.0) << endl; 

return 0; 
} 

header.h

#ifndef header 
#define header 

double function(double x) 
{ 
return 5*exp(I*x).real(); 
} 

#endif 
+1

當你說你收到錯誤時,你也應該說他們是什麼錯誤。 – asgs

+0

你寫了'我寫了一段使用complex.h頭文件的代碼'但是你的代碼不顯示'#include「complex.h」'或'#include '。我是否有編譯錯誤? – Grzegorz

+0

我犯了一個錯誤,我應該寫複雜的圖書館 – MOON

回答

3

問題是I在解析頭文件時沒有定義。您需要在#include "header.h"之前移動I的定義。

+0

只需將其包含在需要的頭文件中即可。 –

+0

@EdS .:錯誤的標題你的想法。 – Linuxios

+0

@EdS。 - 好點,但如果任何其他代碼必須包含這個頭,我們不得不嘗試其他的東西。也許像'extern cmp I'這樣的東西是最好的計劃。 –

2

你應該在你的頭(header.h)庫頭文件,它使用的庫符號。

#include <complex> 

將文件的所有依賴關係包含在它自己內部總是比較好,而不是依賴於否則將包含它們。也許你的header.h被包含在某個地方,庫符號名稱依賴不會通過其他包含來間接解析。

編輯:

在一個側面說明,我不知道爲什麼你包括在頭文件本身的函數的定義。你應該改變頭只有聲明:

header.h

#ifndef header 
#define header 

#include <complex> 

typedef std::complex<double> cmp; 
extern cmp I; 

double function(double x); 

#endif 

添加定義功能

header.cpp另一個源文件

#include "header.h"  


double function(double x) 
{ 
    return 5*exp(I*x).real(); 
} 

main.cpp

#include <iostream> 
#include "math.h" 
#include <complex> 
#include "header.h" 

using namespace std; 
cmp I(0.0,1.0); 

int main() 
{ 
    cout << function(5.0) << endl; 

return 0; 
+0

他的確如此。這不是一個答案。 – Linuxios

+0

@Linuxios:如果他這樣做,我不會看到他在這麼做,我不知道他是如何知道他的。 –

+0

@Linuxios:不,他沒有,仔細閱讀。他的頭文件中有一個函數定義。這是最好的答案。 –

3

因爲I定義後header包括你的main.cpp從本質上變成這樣:

double function(double x) 
{ 
    return 5*exp(I*x).real(); 
} 

using namespace std; 
typedef complex<double> cmp; 
cmp I(0.0,1.0); 

編譯器解析你的函數,並拋出一個錯誤,因爲它不知道什麼I是(還) 。

你應該包括函數的函數之前依賴,像這樣在你的頭文件的任何常量:

#ifndef header 
#define header 

#include <complex> 

typedef complex<double> cmp; 
cmp I(0.0,1.0); 

double function(double x) 
{ 
    return 5*exp(I*x).real(); 
} 

#endif 
+0

謝謝。 它是否適合你,我無法編譯它。 – MOON

+0

我添加了#include 和「using namespace std;」在typedef頭文件之前,然後你的代碼工作。 – MOON

2

改變你的頭。h至包含此:

double function(std::complex<double> I, double x) 
因此它包含此

更改您的main.cpp:

cout << function(I, 5.0) << endl ; 

你的問題是因爲在你header.h你使用可變我這是不可見的。

+0

謝謝。 它爲我工作,但對於其中的函數的類型應該是複雜的,而不是雙倍的情況。 – MOON

+0

你問第二個參數還是結果? 總之,可以這樣:'的std ::複雜功能(標準::複合我的std ::複雜 X)' – Grzegorz

相關問題