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

「1」ではなく「b」を印刷するように印刷機能を取得するにはどうすればよいですか?

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

[編集] aschepler が以前に述べたoperator<<(ostream &, bar::a)ように、 の定義の前に が可視であることを確認するだけで済みます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 に答える