c++ - 我在 .h 中有一个枚举类,在 .cpp 错误中有运算符重载:'operator<<' 不匹配
问题描述
操作系统.h
#ifndef OPERATING_SYSTEM_H
#define OPERATING_SYSTEM_H
#include <iostream>
enum class OperatingSystem
{
unknown,
android,
iOS,
macOS,
Linux,
propietary,
Unix,
windows
};
#endif
操作系统.cpp
#include "OperatingSystem.h"
std::ostream& operator<< (std::ostream& os,
OperatingSystem OS)
{
switch (OS)
{
case OperatingSystem::unknown : os << "unknown OS";
break;
case OperatingSystem::android : os << "Android OS";
break;
case OperatingSystem::iOS : os << "iOS";
break;
case OperatingSystem::macOS : os << "MacOS";
break;
case OperatingSystem::Linux : os << "Linux OS";
break;
case OperatingSystem::propietary : os << "proprietary OS";
break;
case OperatingSystem::Unix : os << "Unix OS";
break;
case OperatingSystem::windows : os << "MS Windows OS";
break;
}
return os;
}
错误
Device.cpp:17:68: 错误: 'operator<<' 不匹配(操作数类型为'std::basic_ostream' 和'OperatingSystem')std::cout << get_model() << ", RAM " << _main_memory << "GB, " << get_os();
解决方案
operator<<
您必须在头文件中提供声明:
std::ostream& operator<< (std::ostream& os,
OperatingSystem OS);
错误消息来自另一个翻译单元 (Device.cpp),它不包含 OperatingSystem.cpp,而仅包含头文件 OperatingSystem.h。OperatingSystem.h 文件不包含您尝试调用的函数的声明。因此,Device.cpp 翻译单元中缺少该函数。
一旦您提供了该声明,编译器就知道存在这样的函数,并且如果正确调用,链接器稍后将能够解析它。
推荐阅读
- flutter - 客户端管理网页、firebase 存储、firebase 实时数据库和颤振
- laravel - Laravel 同名字段集合数据求和
- python - 如何使用 pandas 的 .map() 方法创建新列?
- groovy - 在常规中用另一个字符串替换路径中的字符串
- javascript - 将模板 v-for 转换为计算
- docker - docker pull 在不同的机器上获取不同的层?
- python - 如何解析密码学 x509 扩展
- java - 从 Java 中的 ZIP 字符串生成数据矩阵
- flutter - 如何使用flutter web在URL中传递多个参数
- javascript - 将变量插入字符串时出现预期的令牌错误 - Javascript