2011-11-10 74 views
9

如何让像这样的嵌套私人类的运营商< <超载?为嵌套私有类重载operator <<可能吗?

class outer { 
    private: 
    class nested { 
     friend ostream& operator<<(ostream& os, const nested& a); 
    }; 
    // ... 
}; 

当试图外部类的编译器之外抱怨隐私:

error: ‘class outer::nested’ is private 

回答

13

你可以使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) 
    }; 
    // ... 
}; 
+0

和TH e打印函数应该是'const'成员函数。如果它是'std :: ostream&print(std :: ostream&out)const',那么'operator <<'可以只是一行:'return obj.print(dest);'。 – Nawaz

+0

为什么std:ostream需要成为Inner的朋友? – Mordachai

+1

因为你不能在'Inner'中定义它,否则。 (如果它没有在'Inner'中定义,那么你有问题,它不能访问'Inner',因为'Inner'是'Outer'的私有成员。) –

6

,如果你想在两个不同的文件同样的事情(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; 
}