2009-02-09 2 views
1

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

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

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

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

    return 0; 
} 

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

ответ

2

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

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

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

Да. Это совершенно бессмысленно. Но я не знал, смогу ли я сделать это на моем пути, или если я должен был сделать это на вашем пути (что еще более бессмысленно). Но я просто пробую разные вещи. – mslot

+0

И вам нужно предоставить все операторы int, а не только конструктор в вашей коробке int. – Muxecoid

+0

уверен, что я просто демонстрировал. во всяком случае, это зависит от того, что он хочет делать со своим коробочным int :) – 2009-02-09 11:43:02

2

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

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

В качестве альтернативы вы могли бы сделать коробочный Int класс и переопределить < < для стандартного ostream и коробочный Int (как в ответ Ириимулянья). Звучит как огромный перебор, но может работать.

1

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

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

    return 0; 
} 

все работает должным образом.

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

редактировать - станд :: выше должна быть Каус StD :: соиЬ

+0

Мне очень жаль, что я не могу обеспечить выход ошибки, что компилятор печатает. – mslot

+0

Это не решает проблему «append-an-endl», не так ли? – xtofl

+0

Нет, это не так. Это не имеет никакого отношения к тому, что у меня проблема для проекта или так. Я просто задавался вопросом, как перегружать, и, если можно, перегружает примитивный тип. – mslot

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