2010-11-10 62 views
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”?

+2

尝试确保'foo :: bar :: print()'的定义之前,'operator <<'重载的声明是可见的。 – aschepler 2010-11-10 18:49:02

+0

@aschepler:这是正确的答案。 – 2010-11-10 18:51:26

回答

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
class bar { 
public: 
    enum a { b = 'b', c = 'c', d = 'd' }; 

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

聪明。我喜欢。但是,打印可能不是唯一想要打印枚举的地方。 – 2010-11-10 19:16:00

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

编辑:我看到一些别人贴,虽然我打字这一点。