【问题标题】:C++ redefinitionC++ 重新定义
【发布时间】:2011-09-15 20:49:28
【问题描述】:

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

=== 头文件 ===

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

【问题讨论】:

  • 你可能想使用void operator()(const complex &amp; c) const,因为你没有修改c

标签: c++ redefinition


【解决方案1】:

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

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

Add a(zz);

【讨论】:

  • 不是 Add(zz) 一个构造函数调用,结果被丢弃,还是我弄错了?
  • @Kevin,不,构造函数不返回任何内容,但是为了调用 ctor,您需要创建 Add 类的实例。不确定您的意思是“结果在哪里被丢弃”?
  • @Kevin: Add(zz); 是一个模棱两可的语句,可以解释为声明Add zz; 或创建一个临时类型Add 的表达式。 C++ 中的此类歧义通过声明得到解决。
  • @Kevin:构造函数没有名字。虽然您可能认为您正在创建一个立即消失的匿名临时文件,但实际上您正在陷入解析陷阱。试试(Add(zz));
  • @Tony The Lion:对不起,Java 编程对我来说太多了……我猜new Add(zz) 会创建一个 Add 实例,而不是分配给任何东西……
【解决方案2】:

您可以选择在声明中为变量名加上括号。

int (i);

相同
int i;

因此,在您的情况下,您声明了一个名为zz 的变量Add,并且一个名为zz 的变量已经存在。您可能打算将 zz 作为参数传递给 Add 构造函数,但是您应该为变量命名:

Add adder(zz);

但是,我根本看不到该实例在哪里使用。


但是如果你只是想调用Add的构造函数而不声明变量,你可以在整个表达式周围加上括号:

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

欢迎使用 C++ ;)

【讨论】:

    【解决方案3】:

    Add(zz) 应该是什么意思?你觉得这意味着什么?

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

    Add(zz);
    

    等价于

    Add zz;
    

    您之前已经定义了zz,这就是您收到重新定义错误的原因。这并不奇怪。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多