c++ - 私有(private)类的 friend

标签 c++ friend

如何为私有(private)类(class)定义 friend ?

#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 时它有效

 friend std::ostream & operator<<(std::ostream &os, const Priv_t& obj) { return os << "priv"; }

如何在类/结构定义之外做到这一点?

最佳答案

虽然Priv_t是私有(private)声明,但你应该移动

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);
};

Live code.

关于c++ - 私有(private)类的 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23626045/

相关文章:

c++ - 类声明的循环依赖

c++ - 使用 GL_QUADS 在侧面立方体上进行 OpenGL 纹理映射

c++ - NetBeans 有 C 自动注释吗?

c++ - 关于 C++ 友元声明中没有返回类型的意外错误

c++ - 为模板类重载友元运算符<<

c++ - 如何将全局范围函数声明为命名空间类的 friend ?

c++ - 在 C++ 中将类模板声明为类模板的友元

c++ - cudaMallocPitch 'Invalid Arguments' 尽管复制指南?

c++ - OpenCV 如何处理 Mat 作为指针来加速代码?

c++ - 获取UTF-8编码的std::string的实际长度?