0

関数クラスを実装しようとしていますが、再定義のエラーが発生しました。ばかげていることはわかっていますが、誰か助けてもらえますか?

=== ヘッダファイル ===

#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);
}
4

3 に答える 3

3

Add クラスがあるので、コンストラクターを呼び出すために、そのインスタンスを作成する必要があります。

したがって、以下のケースでは、クラスaのインスタンスです。Add

Add a(zz);
于 2011-09-15T20:53:07.003 に答える
2

オプションで、宣言内の変数名を括弧で囲むことができます。

int (i);

と同じです

int i;

したがって、あなたの場合zz、 type という名前の変数を宣言してAddおり、という名前の変数がzz既に存在しています。おそらくコンストラクターにzz引数として渡すAddつもりでしたが、変数に名前を付ける必要があります。

Add adder(zz);

ただし、そのインスタンスがどこで使用されているかはまったくわかりません。


しかし、変数を宣言せずに のコンストラクターを呼び出したいだけの場合はAdd、式全体を括弧で囲むことができます。

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

C++ へようこそ ;)

于 2011-09-15T20:58:56.820 に答える
1

とはAdd(zz)どういう意味ですか? それはどういう意味だと思いますか?

Add(zz)は実際にzzは type の object の宣言ですAdd。つまり

Add(zz);

と同等です

Add zz;

以前に定義しているzzため、再定義エラーが発生します。ここで驚きはありません。

その行で何をしようとしているのかを知らずに、これ以上あなたを助ける方法はありませんAdd(zz).

于 2011-09-15T20:54:25.303 に答える