过载运算符<<对于成员函数中的类的枚举成员

时间:2010-11-10 18:40:46

标签: c++ operator-overloading operator-keyword

如何重载<<作为类成员的枚举的运算符。具体来说,我有以下代码:

#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 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案:

#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 :(得分:1)

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

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

答案 2 :(得分:0)

问题是,在宣布您的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;
}
编辑:我在打字时看到其他一些帖子。