C ++重新定义

时间:2011-09-15 20:49:29

标签: c++ redefinition

我正在尝试实现一个函数类,但是出现了重定义错误。我知道这很愚蠢,但有人可以帮忙吗?

===头文件===

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

3 个答案:

答案 0 :(得分:3)

你有一个Add类,所以你需要创建一个它的实例,以便调用构造函数。

所以在下面的例子中,a是我们Add类的一个实例。

Add a(zz);

答案 1 :(得分:2)

您可以选择在声明中将变量名括号括起来。

int (i);

相同
int i;

因此,在您的情况下,您声明名为zz的{​​{1}}类型的变量,并且已存在名为Add的变量。你可能想将zz作为参数传递给zz构造函数,但是你应该给变量命名:

Add

但是,我根本没有看到该实例的使用位置。


但是如果你只是想在没有声明变量的情况下调用Add adder(zz); 的构造函数,你可以在整个表达式中加上括号:

Add

欢迎使用C ++;)

答案 2 :(得分:1)

Add(zz)应该是什么意思?您认为这意味着什么?

Add(zz)实际上是zz类型的对象Add的声明,即

Add(zz);

相当于

Add zz;

您之前已经定义过zz,这就是您获得重新定义错误的原因。这里不足为奇。

如果不了解您Add(zz)行尝试做什么,就无法进一步帮助您。