首页 > 解决方案 > 不能为命名空间中的私有枚举重载 i/o 运算符

问题描述

我在命名空间内的一个类中有一个私有枚举。我试图重载 I/O 运算符,但我得到的只是编译器抱怨 Enum 是私有的。这篇文章的解决方案对我没有任何帮助。这是我的问题的一个孤立版本。

测试类.h

#include <iostream>
namespace Test
{
    class TestClass
    {
        enum Enum : unsigned int {a = 0, b};
        friend std::ostream& operator<<(std::ostream& os, Enum e);
    };
    std::ostream& operator<<(std::ostream& os, TestClass::Enum e);
};

测试类.cpp

#include "TestClass.h"
std::ostream& operator<<(std::ostream& os, Test::TestClass::Enum e)
{
    //do it
}

编译器对此有所抱怨,但是当我从命名空间中删除该类时并没有抱怨,那么我该如何编译呢?

我正在使用

g++ -c 测试类.h

编译这个

标签: c++enumsnamespacesoperator-overloadingfriend

解决方案


您的 cpp 文件中的运算符不是您声明的朋友。朋友是命名空间的成员,因为它声明的类是成员。

因此,也将运算符定义包装在命名空间范围内。或完全限定定义

std::ostream& Test::operator<<(std::ostream& os, Test::TestClass::Enum e)
{
    //do it
}

推荐阅读