2012-05-26 1 views
0

Я использую конечный автомат для изучения C++, и я хочу предоставить перегруженный operator <<, чтобы вернуть соответствующую строку вместо int. Извините, направьте комментарий ...Как перегрузить << правильно из отображаемого перечисления?

#ifndef STATEMACHINE_H 
#define STATEMACHINE_H 

#include <map> 
#include <string> 

namespace statemachine{ 
    using namespace std; 

    enum State { ON, RESTING, SLEEPING, LOCKED, OFF }; 

    struct StateMap : map<unsigned int, string> 
    { 
     StateMap() 
     { 
      this->operator[](ON) = "ON"; 
      this->operator[](RESTING) = "RESTING"; 
      this->operator[](SLEEPING) = "SLEEPING"; 
      this->operator[](LOCKED) = "LOCKED"; 
      this->operator[](OFF) = "OFF"; 
     }; 

     ~StateMap(){}; 
    }; 

struct Machine { 

    Machine(State state) : statemap() { 
     m_currentstate = state; 
    } 

    // trying to overload the operator -- :(
    // Error 1 error C2676: binary '<<' : 'std::ostream' does not define this operator or a 
    // conversion to a type acceptable to the predefined operator **file** 38 1 statemachine_01 
    ostream& operator << (ostream& stream){ 
     stream << statemap[m_currentstate]; 
     return stream; 
    } 

    State state() const { 
     return m_currentstate; 
    } 

    void set_state(State state){ 
     m_currentstate = state; 
    } 

private: 
    State m_currentstate; 
    StateMap statemap; 
}; 

} 

#endif 

Что я делаю неправильно?

+0

@OliCharlesworth: Я посмотрел на этот вопрос, и это не совсем то же самое - мы получили две разные ошибки компиляции. – IAbstract

+0

Но этот вопрос (вместе с ответами) показывает фрагменты кода о том, как правильно перегрузить 'operator <<'. –

+0

@OliCharlesworth: Я читал дальше и узнал, что работает (http://stackoverflow.com/a/9230853/210709). – IAbstract

ответ

0

Вы определяете operator << как член Machine. Это означало бы, что она будет называться так:

machine << stream; 

вместо:

stream << machine; 

Вы должны определить operator как свободная функция, чтобы иметь возможность принимать аргументы в правой заказ. Например, вы могли бы сделать это будет friend функция:

friend ostream& operator << (ostream& stream, Machine const& m){ 
    stream << m.statemap[m.m_currentstate]; 
    return stream; 
} 
+0

By * Вам нужно определить оператор как свободную функцию * ... вы имеете в виду в моем заголовочном файле, а не внутри структуры? Извините, я новичок в C++ и пытаюсь понять, как все работает. Я знаком с C#. – IAbstract

+0

@IAbstract: Свободная функция - это функция, которая не является членом класса. Если вы замените свое определение 'operator <<' моим, оно должно просто работать. Вы можете начать получать дублирующие ошибки компоновщика для определения свободной функции в файле заголовка, чтобы избежать их объявления функции 'inline' (или переместить ее определение в файл .cpp). –

+0

Я нашел решение, объясняющее более detial: http://stackoverflow.com/a/9230853/210709 – IAbstract

0

Он не должен ничего делать с перегрузкой (ну, несколько возможно).

Это утверждение

stream << statemap[m_currentstate]; 

терпит неудачу, так как вы не определили, как применить StateMap к < <.

[Вы должны перегружать < < в классе statemap тоже.]

К сожалению, вам нужна автономная функция, а не метод, см другой ответ.

+0

'statemap [m_currentstate]' возвращает строку 'std :: string', для которой определен вывод потока. –

+0

Вы правы. Мой ответ был вздор. – JohnB

Смежные вопросы