2011-09-15 117 views
0

我想實現一個函數類,但得到了重新定義的錯誤。我知道這很愚蠢,但任何人都可以請幫忙嗎?C++重新定義

===頭文件===

#ifndef _NS4_h 
#define _NS4_h 

#include <vector> 
#include <list> 

namespace NS4{ 
    class complex{ 
    double r, i; 
    public: 
     complex(double a=0, double b=0) : r(a), i(b) {};  
     complex operator+(complex c); 
     complex &operator+=(complex c); 
     complex &operator=(complex c); 
    }; 

    // function class 
    class Add{  
     complex val; 
    public: 
     Add(complex c){ val = c; } 
     Add(double r, double i) { val = complex(r, i); } 
     void operator()(complex& c) const { c += val; } 
    }; 

    void h(std::vector<complex> &aa, std::list<complex> ll, complex z); 
} 
#endif 

cpp文件===

using namespace NS4; 
void test9() 
{ 

    vector<complex> aa; 
    aa.push_back(complex(0,1)); 
    aa.push_back(complex(0,2)); 
    aa.push_back(complex(0,3)); 

    list<complex> ll; 
    ll.push_back(complex(1,1)); 
    ll.push_back(complex(1,2)); 
    ll.push_back(complex(1,3)); 

    complex zz(1,1); 

    // the following line is not working 
    // error C2371: 'zz' : redefinition; different basic types 
    Add(zz); // Add(complex(1,1)) is working. 

    h(aa,ll, zz); 
} 
+0

你可能想使用'void operator()(const complex&c)const'因爲您沒有修改'c' – GWW

回答

3

你有一個添加類,所以你需要創建一個實例的部分===它是爲了調用構造函數。

因此在以下情況下,a是我們的Add類的一個實例。

Add a(zz); 
+0

不是添加(zz)一個構造函數調用,結果被丟棄,還是我誤解了? – Kevin

+0

@Kevin,不,構造函數不返回任何東西,但爲了調用ctor,您需要創建Add類的實例。不確定你的意思是「結果在哪裏分散」? –

+0

@Kevin:'Add(zz);'是一個模棱兩可的語句,它可以被解釋爲一個聲明'Add zz;'或者一個表達式來創建一個類型爲'Add'的臨時表達式。 C++中的這種歧義被解析爲贊成聲明。 – AnT

1

Add(zz)是什麼意思?你認爲這意味着什麼?

Add(zz)實際上是Add類型的對象zz的聲明,即

Add(zz); 

相當於

Add zz; 

您之前已經定義zz,這就是爲什麼你得到了重新定義錯誤。這裏毫不奇怪。

如果不知道Add(zz)這條線是怎麼做的,那麼沒有辦法進一步幫助您。

2

您可以在聲明中圍繞變量名添加括號。

int (i); 

相同

int i; 

所以你的情況你聲明名爲Addzz變量,一個名爲zz變量已經存在。你可能意味着通過zz作爲參數傳遞給Add構造,但你應該給一些名字變量:

Add adder(zz); 

不過,我看不出該實例使用的。


但如果你只是想調用的Add構造不聲明變量,就可以把括號圍繞整個表達式:

(Add(zz)); //just calls Add::Add(Complex); 

歡迎C++)