Вы можете далее обобщить функцию для работы с любыми чертами характера, если вы используете подпись

я есть следующий код:

struct simple
{
    simple (int a1, int a2) : member1(a1), member2(a2) {}
    int member1;
    int member2;
};

std::ofstream &operator << (std::ofstream &f, const simple &obj)
{
    f<<obj.member1<<", "<<obj.member2;
    return f;
} 
int main(int argc, const char *argv[])
{
    std::ofstream f("streamout.txt");

    simple s(7,5);
    f << s;               //#1 This works
    f << "label: " << s;  //#2 This fails

    return 0;
}

Я пытаюсь понять, почему работает # 1, в то время как возникают проблемы при попытке использовать перегруженный оператор, объединяющий его, как в # 2, который завершается ошибкой со следующей ошибкой (gcc 4.5.3 в MacOSX):

ошибка: невозможно связать значение 'std :: basic_ostream' со значением 'std :: basic_ostream &&' /GCC-FACTORY/4.5/INSTALL/lib/gcc/x86_64-apple-darwin10.5.0/4.5.3/../../. ./../include/c++/4.5.3/ostream:579:5: ошибка: инициализация аргумента 1 из 'std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> &&, const _Tp &) [с _CharT = char, _Traits = std :: char_traits, _Tp = simple] '

Вместо этого все в порядке, если я определю свой оператор как

std::ostream &operator << (std::ostream &f, const simple &obj)
{ ... }

Похоже, что-то, связанное с разрешением перегрузки, когда вставка чего-то в ofstream, для которого уже предусмотрена перегрузка (в данном случае const char * "label"), разбивается после разрешения перегрузки, но я не могу понять, что именно здесь происходит Я хотел бы получить четкое представление о том, что пытается сделать компилятор ..

 Oliver Charlesworth09 янв. 2011 г., 19:47
Я не знаю конкретно, почему компилятор жалуется, но перегрузка дляostream (то есть общий базовый класс) - это правильная вещь, так как он позволяет использовать его для всех видов выходных потоков.

Ответы на вопрос(1)

Решение Вопроса

На линии :

f << "label: " << s;

Потому что первый звонокoperator<< возвращаетstd::ostream &, вторая не компилируется: левый операнд к оператору не имеет типаstd::ofstream больше и ваша перегрузка не найдена.

Вы действительно должны использовать вторую подпись, так как я не вижу причин для ограничения вашего типа для выводаstd::ofstream.

 wilhelmtell09 янв. 2011 г., 20:30
Вы можете далее обобщить функцию для работы с любыми чертами характера, если вы используете подписьtemplate<class Ch,class Tr> std::basic_ostream<Ch,Tr>& operator<<(std::basic_ostream<Ch,Tr>& s, const simple& obj);
 Nawaz09 янв. 2011 г., 20:27
Тем не мение,f << s << "label: " должно работать, хотя!

Ваш ответ на вопрос