Не могу перегрузить операторы ввода / вывода для частного перечисления в пространстве имен - PullRequest
1 голос
/ 25 марта 2019

У меня есть личное перечисление в классе в пространстве имен.Я пытаюсь перегрузить операторы ввода / вывода, но все, что я получаю, это компилятор, жалующийся о том, что Enum является закрытым.Решение из "> этого поста не помогло мне.Вот изолированная версия моей проблемы.

TestClass.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);
};

TestClass.cpp

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

Компилятор жалуется на это, но не жалуется, когдаЯ удаляю класс из пространства имен, так как мне получить его для компиляции?

Я использую

g ++ -c TestClass.h

чтобы скомпилировать

1 Ответ

3 голосов
/ 25 марта 2019

Оператор в вашем файле cpp не тот друг, которого вы объявили. Друг является членом пространства имен, потому что класс, в котором он объявлен, является членом.

Так что оберните определение оператора в область имен. Или полностью уточните определение

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