3

我们有以下内容:(伪)

class MyClass
{
    private:
       struct MyStruct{
          MyStruct operator=(const MyOtherStruct& rhs);
          int am1;
          int am2;
       };
};

我们想重载=MyClass.cpp 中的运算符来执行以下操作:

MyStruct&
MyStruct::operator=(const MyOtherStruct& rhs)
{
   am1 = rhs.am1;
   am2 = rhs.am2;
}

但是,它不想编译。我们收到类似的错误

“缺少;在 & 之前”

“如果后面跟着 ::,MyStruct 必须是一个类或命名空间”

我在这里缺少一些概念吗?

4

2 回答 2

3

您需要将operator=for移动MyStruct到结构声明主体中:

class MyClass
{
    private:
       struct MyStruct{
          int am1;
          int am2;

          MyStruct& operator=(const MyOtherStruct& rhs)
          {
             am1 = rhs.am1;
             am2 = rhs.am2;
             return *this;
          }
       };
};

或者如果因为MyOtherStruct不完整或不想弄乱类声明而无法做到这一点:

class MyClass
{
    private:
       struct MyStruct{
          int am1;
          int am2;

          MyStruct& operator=(const MyOtherStruct& rhs);
       };
};

inline MyClass::MyStruct& MyClass::MyStruct::operator=(const MyOtherStruct& rhs)
{
    am1 = rhs.am1;
    am2 = rhs.am2;
    return *this;
}
于 2013-10-03T23:06:52.527 回答
2

语法是

MyStruct& operator=(const MyOtherStruct& rhs) {
   // assignment logic goes here
   return *this;
}

对于直接在MyStruct. 另请注意,我添加了惯用语return *this以让赋值返回对该对象的引用。

编辑以响应 OP 编辑​​问题。您还可以在正文中声明运算符,并在其他地方定义它。在这种情况下,语法是:

MyClass::MyStruct& MyClass::MyStruct::operator=(const MyOtherStruct& rhs) {
   // assignment logic goes here
   return *this;
}
于 2013-10-03T23:03:37.843 回答