У меня есть класс enum в .h и перегрузка оператора в. cpp ошибка: нет совпадения для 'operator <<' - PullRequest
0 голосов
/ 05 февраля 2020

OperatingSystem.h

#ifndef OPERATING_SYSTEM_H
#define OPERATING_SYSTEM_H

#include <iostream>

enum class OperatingSystem
{
    unknown,
    android, 
    iOS, 
    macOS, 
    Linux, 
    propietary, 
    Unix, 
    windows 
};

#endif

OperatingSystem. 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;
}

Ошибка

Устройство. cpp: 17: 68: ошибка: нет совпадения для 'operator <<' (типы операндов: 'std :: basic_ostream' и 'OperatingSystem') std :: cout << get_model () << ", RAM" << _main_memory << "GB," << get_os () ; </p>

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Ошибка вызвана тем, что операторам по умолчанию не разрешено работать с пользовательскими типами (например, объектами, структурами, перечислимым классом). Таким образом, мы имеем перегрузку оператора оператора выходного потока, который принимает в качестве аргумента класс enum.

Объявляем перегрузку оператора потока вывода в заголовочный файл

std::ostream& operator<< (ostream&, const OperatingSystem&)

Импортируем headerFile Определить перегрузку оператора выходного потока

include "OperatingSystem.h"
std::ostream& operator<<(ostream& o, const OperatingSystem& os)
{
  // implementation
  o << "example";
  return o;
}
0 голосов
/ 05 февраля 2020

Вы должны предоставить объявление operator<< в заголовочном файле:

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

Сообщение об ошибке получено из другого модуля перевода (Device. cpp), который не включает OperatingSystem. cpp но только заголовочный файл OperatingSystem.h. Файл OperatingSystem.h не содержит объявления функции, которую вы пытаетесь вызвать. В результате в устройстве отсутствует функция. cpp модуль перевода.

После того, как вы предоставили это объявление, компилятор знает, что такая функция существует и что компоновщик сможет ее разрешить. позже, если вызывается правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...