首页 > 解决方案 > 我在 .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();

标签: c++operator-overloadingenum-class

解决方案


operator<<您必须在头文件中提供声明:

std::ostream& operator<< (std::ostream& os, 
OperatingSystem OS);

错误消息来自另一个翻译单元 (Device.cpp),它不包含 OperatingSystem.cpp,而仅包含头文件 OperatingSystem.h。OperatingSystem.h 文件不包含您尝试调用的函数的声明。因此,Device.cpp 翻译单元中缺少该函数。

一旦您提供了该声明,编译器就知道存在这样的函数,并且如果正确调用,链接器稍后将能够解析它。


推荐阅读