2013-10-03 3 views
2

Мы имеем следующее: (pseudoish)Перегрузки оператор = для структур, внутри классов

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 должен быть класс или пространство имен, если следуют ::"

Есть ли какое-то понятие здесь, я не хватает?

+1

Почему у вас есть 2 типа возврата на ваш оператор = функция? – goji

+0

эй спасибо, исправлено! – MrDuk

+1

Вам не хватает квалификации. Нет класса MyStruct вне класса. – chris

ответ

2

Вы должны переместить operator= для 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; 
} 
+0

Не было закончено редактирование другого варианта .... – goji

+0

Извините, но мне пришлось прокомментировать, что я на самом деле видел. ;) – syam

+0

Почему мы используем 'inline' здесь? Это необходимо? – MrDuk

2

Синтаксис является

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

для оператора непосредственно в теле MyStruct. Также обратите внимание, что я добавил idiomatic return *this, чтобы присвоение возвращало ссылку на этот объект.

EDIT в ответ на редактирование вопроса. Вы также можете объявить оператор в теле и определить его где-то еще. В этом случае синтаксис:

MyClass::MyStruct& MyClass::MyStruct::operator=(const MyOtherStruct& rhs) { 
    // assignment logic goes here 
    return *this; 
} 
Смежные вопросы