2011-09-15 11 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 

インスタンスを作成する必要があるので、

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

あなたはおそらくしたいです) 'c 'を変更していないので' void operator()(const complex&c)const'を使用する – GWW

答えて

3

あなたは、追加のクラスを持っているのcppファイル=== ===のパートそれをコンストラクタを呼び出すために使用します。

ので、下記の場合には、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の宣言であるあなたはすでにあなたが再定義エラーを取得する理由である、前zzを定義している

Add zz; 

に相当します。ここで驚きはありません。

あなたはそのAdd(zz)線でやろうとしたものを知らなくても、さらにあなたを助けるための方法はありません。

2

オプションで、宣言で変数名を中心に括弧を置くことができます。

int (i); 

は、だからあなたの場合には、あなたがタイプAddzzという名前の変数を宣言している、とzzという名前の変数がすでに存在している

int i; 

と同じです。おそらくAddコンストラクタの引数としてzzを渡すためのものが、その後、あなたは変数にいくつかの名前を与える必要があります。そのインスタンスが全く使用されているところ

Add adder(zz); 

は、しかし、私は表示されません。


しかし、あなただけの変数を宣言せずAddのコンストラクタを呼び出したい場合は、式全体の周りに括弧を置くことができます:C++へ

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

ようこそ。