[英]friend for private class
如何為私人班級定義朋友?
#include <iostream>
class Base_t{
private:
struct Priv_t{
friend std::ostream & operator<<(std::ostream &os, const Priv_t& obj);
} p;
friend std::ostream & operator<<(std::ostream &os, const Base_t& obj);
};
std::ostream & operator<<(std::ostream &os, const Base_t& obj) {
return os << "base: " << obj.p;
}
std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj) {
return os << "priv";
}
int main() {
Base_t b;
std::cout << b << std::endl;
}
錯誤:
:!make t17 |& tee /tmp/vB5G5ID/54
g++ t17.cpp -o t17
t17.cpp: In function 'std::ostream& operator<<(std::ostream&, const Base_t::Priv_t&)':
t17.cpp:5:16: error: 'struct Base_t::Priv_t' is private
struct Priv_t{
^
t17.cpp:15:59: error: within this context
std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj) {
^
make: *** [t17] Error 1
shell returned 2
當我直接在Priv_t中定義朋友時,它起作用
friend std::ostream & operator<<(std::ostream &os, const Priv_t& obj) { return os << "priv"; }
如何在類/結構定義之外進行?
雖然Priv_t
是私有聲明,但您應該移動
friend std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj);
進入Base_t
:
class Base_t
{
private:
struct Priv_t
{
} p;
friend std::ostream & operator<<(std::ostream &os, const Base_t& obj);
friend std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj);
};
對於超載Priv_t
將不得不朋友Base_t
以及Priv_t
。
友誼必須明確:
class Base_t
{
//...
private:
//...
// Add:
friend std::ostream & operator<<(std::ostream &os,
const Base_t::Priv_t& obj);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.