c++ - 不能为命名空间中的私有枚举重载 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
编译这个
解决方案
您的 cpp 文件中的运算符不是您声明的朋友。朋友是命名空间的成员,因为它声明的类是成员。
因此,也将运算符定义包装在命名空间范围内。或完全限定定义
std::ostream& Test::operator<<(std::ostream& os, Test::TestClass::Enum e)
{
//do it
}
推荐阅读
- ios - -thingWithContentsOfFile:与 NSPropertyListSerialization
- android - 如果背景是 ?android:attr/selectableItemBackground(AlertDialog 中的 ListView),如何使 View 看起来像是被编程选择
- vb.net - 如何在 vb.net 中使用数据填充 XML
- c++ - C++ - 将数字添加到列表中?(如 Python)
- angular - KarmaJS 在 afterAll 方法中抛出只读错误
- excel - 在 Excel 单元格中为单元格中的每一行创建单独的下拉列表
- python - 如何使用openCV更改它继续循环的python脚本和错误
- node.js - 在 npm 和 git 中同步版本管理
- log4net - Log4net 文件 rollingFile 不删除旧文件
- static - 如何在 Vue 2.5 中的 index.html 上添加静态文件链接?