簡體   English   中英

私人班級的朋友

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM