如何为像以下这样的嵌套私有类重载运算符<<?
class outer {
private:
class nested {
friend ostream& operator<<(ostream& os, const nested& a);
};
// ...
};
当尝试在外部类之外使用时,编译器会报隐私问题:
error: ‘class outer::nested’ is private
如何为像以下这样的嵌套私有类重载运算符<<?
class outer {
private:
class nested {
friend ostream& operator<<(ostream& os, const nested& a);
};
// ...
};
当尝试在外部类之外使用时,编译器会报隐私问题:
error: ‘class outer::nested’ is private
operator<<
设为outer
的友元函数,或者在nested
中完全使用inline
实现,例如:class Outer
{
class Inner
{
friend std::ostream&
operator<<( std::ostream& dest, Inner const& obj )
{
obj.print( dest );
return dest;
}
// ...
// don't forget to define print (which needn't be inline)
};
// ...
};
如果你想在两个不同的文件(hh、cpp)中使用相同的函数,你需要这样做两次:
hh:
// file.hh
class Outer
{
class Inner
{
friend std::ostream& operator<<( std::ostream& dest, Inner const& obj );
// ...
};
friend std::ostream& operator<<( std::ostream& dest, Outer::Inner const& obj );
// ...
};
cpp:
// file.cpp:
#include "file.hh"
std::ostream &operator<<( std::ostream& dest, Outer::Inner const& obj )
{
return dest;
}
std::ostream& print(std::ostream &out) const
,那么operator<<
可以只有一行代码:return obj.print(dest);
。 - NawazInner
中定义它。否则,如果它没有在Inner
中定义,你就会遇到一个问题,即它无法访问Inner
,因为Inner
是Outer
的私有成员。 - James Kanzestd::ostream
,而是operator<<( std::ostream& dest, Inner const& obj )
。std::ostream &
只是该函数的返回类型。 - Omnifarious