Оператор перегрузки << для примитивных типов. Это возможно? - PullRequest
3 голосов
/ 09 февраля 2009

Эй. Можно ли перегрузить оператор << для примитивных типов? Fx скажем, что я хочу написать std :: endl каждый раз, когда хочу написать int. Могу ли я перегрузить оператор << для int, чтобы он автоматически помещал std :: endl в вывод? Я пытался с этим, </p>

std::ostream& operator<<(std::ostream& strm, int & i)
{
   strm << i << std::endl;
   return strm;
}

но это не работает. Я не могу вспомнить сообщение об ошибке компилятора, но я думаю, что я получаю оператор перегрузки все неправильно в любом случае. Я пытаюсь вызвать вышеуказанный перегруженный оператор << таким образом, </p>

int main()
{
   int i = 2;
   std::out<<"Here is an int " << i;

   return 0;
}

Но это не работает вообще. Может быть, я не могу перегрузить типы POD?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2009

Как сказал zabzonk, стандартная библиотека обеспечивает перегрузку (ostream &, int), поэтому вы не можете определить другую.

Имитировать то, что вы делали (хотя в его нынешнем виде это совершенно бессмысленно :):

class EndlinedInteger {
public:
    EndlinedInteger(int i) : i(i) { }
    friend ostream& operator<<(ostream&, EndlinedInteger const&);
private:
    int i;
};

ostream& operator<<(ostream& out, EndlinedInteger const& ei) {
    out << ei.i << endl;
    return out;
}

int main()
{
   EndlinedInteger i = 2;
   std::cout<<"Here is an int " << i;
}
2 голосов
/ 09 февраля 2009

Помните, что здесь вы используете оператор << не только для int, но и для ostream. Вы можете наследовать от ostream и реализовывать его в своем собственном производном классе, но я бы предложил создать простой макрос, такой как </p>

#define EL(i) (i)<<std::endl

В качестве альтернативы вы можете создать упакованный класс int и переопределить класс << для стандартного ostream и упакованный класс int (как в ответе Iraimbilanja). Звучит как огромное излишество, но может сработать. </p>

1 голос
/ 09 февраля 2009

Ваша проблема в том, что уже перегружен для оператора << (ostream &, int), предоставленного стандартной библиотекой C ++. Если вы удалите определение перегрузки и используете: </p>

#include <iostream>
int main()
{
   int i = 2;
   std::out<<"Here is an int " << i;

   return 0;
}

все работает как положено.

И, кстати, сообщения об ошибках компилятора очень важны, поэтому рекомендуется задавать их и указывать в постах при задании вопросов.

edit - std :: out выше должен быть couse быть std :: cout

...