2010-11-10 51 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; 
} 

編輯:我看到一些別人貼,雖然我打字這一點。

相關問題