Вы можете фактически определить функции, не являющиеся членами-друзьями, прямо внутри определения класса.
Вот ваш исправленный фрагмент кода:
#include <iostream>
class MyClass
{
private:
class InnerClass
{
int m_int;
public:
InnerClass(int i) :m_int(i) {}
// non-member (friend) function, which we can define right here
friend std::ostream& operator<<(std::ostream& output, const InnerClass &obj)
{
return output << obj.m_int << " ";
}
};
private:
InnerClass m_innerClass;
public:
explicit MyClass(int i) : m_innerClass{ i } {}
friend std::ostream& operator<<(std::ostream& output, const MyClass &obj);
};
std::ostream& operator<<(std::ostream& output, const MyClass &obj)
{
return output << obj.m_innerClass << std::endl;
}
int main()
{
MyClass classObj{ 2 };
std::cout << classObj;
return 0;
}
Вы можете сделать то же самое с другими operator<<
.
Теперь, если InnerClass
не является частным, вы все равно можете определить функцию в глобальной области видимости, но вам необходимо полностью указать имя второго параметра:
std::ostream& operator<<(std::ostream& output, const MyClass::InnerClass &obj)
{ // ^^^^^^^^^^^^^^^^^^^
return output << obj.m_int << " ";
}