Оператор перегрузки << для перечисляемого члена класса в функциях-членах - PullRequest
0 голосов
/ 10 ноября 2010

Как перегрузить оператор << для перечислений, которые являются членами класса. В частности, у меня есть следующий код ниже: </p>

#include <iostream>

using namespace std;

namespace foo {
    class bar {
    public:
        enum a { b, c, d};

        static void print() {
            cout << b << endl;
        }
    };

    ostream& operator<< (ostream& os, bar::a var) {

        switch (var) {
        case bar::b:
            return os << "b";
        case bar::c:
            return os << "c";
        case bar::d:
            return os << "d";
        }
        return os;
    }


}
int main() {
    foo::bar::print();

    return 0;
}

Как я могу заставить функцию печати печатать "b" вместо "1"?

Ответы [ 3 ]

2 голосов
/ 10 ноября 2010

Вот простое решение:

#include <iostream>

using namespace std;

namespace foo {

    class bar {
    public:
        enum a { b, c, d};

        static void print();
    };

    ostream& operator<< (ostream& os, bar::a var) {

        switch (var) {
        case bar::b:
            return os << "b";
        case bar::c:
            return os << "c";
        case bar::d:
            return os << "d";
        }
        return os;
    }


    void bar::print() {
        cout << b << endl;
    }
}
int main() {
    foo::bar::print();

    return 0;
}

[РЕДАКТИРОВАТЬ] Как ранее заявлено aschepler, вам нужно только убедиться, что operator<<(ostream &, bar::a) виден до определения bar::print.

1 голос
/ 10 ноября 2010
class bar {
public:
    enum a { b = 'b', c = 'c', d = 'd' };

    static void print() {
        cout << char(b) << endl;
    }
};
0 голосов
/ 10 ноября 2010

Проблема в том, что ваше использование cout << bar:: приходит до того, как объявлена ​​ваша перегрузка ostream<< bar::, поэтому она не вызывает вашу перегрузку. Переместите определение вниз.

class bar {
public:
   enum a { b, c, d };
   static void print();
};

ostream& operator<<  (ostream& os, bar::a var) {
   ...

void bar::print()
{
   cout << b << endl;
}

РЕДАКТИРОВАТЬ: я вижу, что еще кто-то опубликовал это, когда я печатал это.

...