0

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

#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”?

4

3 回答 3

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

operator<<(ostream &, bar::a)[编辑] 如aschepler先前所述,您只需要确保bar::print.

于 2010-11-10T18:54:40.370 回答
1
class bar {
public:
    enum a { b = 'b', c = 'c', d = 'd' };

    static void print() {
        cout << char(b) << endl;
    }
};
于 2010-11-10T18:55:31.270 回答
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;
}

编辑:我在打字时看到其他人发布了该内容。

于 2010-11-10T18:56:19.090 回答