-1

我想为 A 重载“+”运算符,struct但我收到编译器警告这是我的尝试:

struct wektor{
    int x;
    int y=0;    
    int norm(){
        return x*x+y*y;
    }
};

wektor& operator +(wektor &a,wektor &b){
    wektor c;
    c.x=a.x+b.x;  // 12 line - warning here
    c.y=a.y+b.y;
    return c;
};

编译器警告:

[警告] 非静态数据成员初始化器仅适用于 -std=c++11 或 -std=gnu++11 [默认启用] 在 12 行

4

4 回答 4

8

警告告诉你这条线:

int y=0;

在 C++11 之前,您不能在非静态非常量成员上使用初始化程序。如果要初始化y为 0,则必须为wektor带有成员初始化列表的构造函数提供构造函数。

尽管如此,您的operator+参数应该是 type const wektor&。它也应该按值返回,因为此时您正在返回对将在函数结束时销毁的本地对象的引用,这很糟糕。它应该如下所示:

wektor operator +(const wektor &a, const wektor &b){
    wektor c;
    c.x=a.x+b.x;  // 12 line - warning here
    c.y=a.y+b.y;
    return c;
};
于 2013-03-05T23:24:30.210 回答
4

首先,二元运算符+应该返回一个新值,而不是一个引用。如果根据作为输入的引用来实现,这些应该是 const:

wektor operator +(const wektor &a, const wektor &b);

其次,警告是关于这个初始化的:

struct wektor{
    int x;
    int y=0;    // HERE! C++11 only
    int norm(){
        return x*x+y*y;
    }
};

您只能在 C++11 中执行此操作。您可以在 C++03 中使用构造函数。

struct wektor{
    wector() : y() {} // zero-initializes y
    int x;
    int y;
    int norm(){ return x*x+y*y;}
};

回到operator+,我会实现一个 member operator+=,然后在 non-member 中使用它operator+

wektor operator +(wektor a, const wektor &b)
{
  return a+= b;
}

或者,为and提供wector两个参数的构造函数:xy

wector(int x, int y) : x(x), y(y) {}

蚂蚁然后

wektor operator + (const wektor& a, const wektor &b)
{
  return wector(a.x + b.x, a.y + b.y);
}
于 2013-03-05T23:24:58.670 回答
2

不是这样的。签名应该是

wektor operator +(const wektor &a, const wektor &b)

即不要从+操作员通过引用返回,更重要的是,不要通过引用返回临时的。

于 2013-03-05T23:24:33.183 回答
1

这是一个警告,表明您正在使用 C++11 中的功能,该功能在以前的 C++ 标准中不可用。

当您知道您所编写的程序按照您的想法工作时,您可以通过执行以下操作来消除此错误:

如果您使用的是代码块:

  1. 右键单击“构建选项...”
  2. 选择“其他选项”选项卡
  3. 添加“-std=gnu++11”

如果您使用的是命令行:将“-std=gnu++11”添加到命令 arg 中。

于 2013-03-05T23:34:52.957 回答