Когда вы объявляете функцию как friend
внутри класса, эта функция не является функцией-членом и выглядит так, как если бы она была объявлена во вложенном пространстве имен. Итак, в вашем случае ваша декларация о друге operator==
,
class Container
{
friend bool operator==(const Container &rhs,const Container &lhs);
};
- это функция, не являющаяся членом, как если бы вы объявили ее вне класса, например:
class Container
{
};
bool operator==(const Container &rhs,const Container &lhs);
Обратите внимание, что когда вы объявляете функцию друга, функция также имеет доступ к закрытым членам класса, так что это не совсем то же самое.
Итак, ваше определение operator==
, как если бы оно было функцией-членом, неверно:
bool Container::operator==(const Container &rhs,const Container &lhs) { ... }
должно быть
bool operator==(const Container &rhs,const Container &lhs) { ... }
Что касается вашей перегрузки operator<<
, она не является другом Container
, поэтому у него нет доступа к частному elements
члену Container
. Либо сделайте operator<<
другом, либо добавьте в класс общедоступные средства доступа, чтобы он мог получать к ним доступ через закрытых членов.