перегрузка оператора
От: CiViLiS Россия  
Дата: 07.09.06 08:48
Оценка:
Доброе время суток.

Понадобилось мне читать из бинарного файла двухбайтные слова. Для этого ввел новый тип typedef auto_value<unsigned short> word и перегрузил оператор >> для этого типа. Все было хорошо пока не перенес auto_value&lt;&gt;
Автор: Кодт
Дата: 16.01.03
в неймспас utils. После переноса istream_iterator отказался видеть перегруженный оператор.
Вот сильно упрощенный пример кода:
#include <iostream>
#include <fstream>
#include <iterator>

namespace utils
{
    class word
    {
        unsigned short t_;
    };
};

std::istream& operator >> (std::istream& stream, utils::word& w)
{
    return stream;
}

int main(int argc, char* argv[])
{
    std::ifstream file("data.bin", std::ios::binary);

    utils::word w;
    file >> w; // здесь все нормально

std::istream_iterator<utils::word> itr = std::istream_iterator<utils::word>(file); // это не компилиться если word в namespace utils. Без namespace все отлично компилиться

    return 0;
}


Проверял на всех компиляторах: VS2005, gcc, comeau.
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re: перегрузка оператора
От: korzhik Россия  
Дата: 07.09.06 09:03
Оценка: 2 (1)
Здравствуйте, CiViLiS, Вы писали:

CVL>Доброе время суток.


CVL>Понадобилось мне читать из бинарного файла двухбайтные слова. Для этого ввел новый тип typedef auto_value<unsigned short> word и перегрузил оператор >> для этого типа. Все было хорошо пока не перенес auto_value&lt;&gt;
Автор: Кодт
Дата: 16.01.03
в неймспас utils. После переноса istream_iterator отказался видеть перегруженный оператор.


Ну так перенеси operator >> в тот же namespace (utils)
Re: перегрузка оператора
От: night beast СССР  
Дата: 07.09.06 09:05
Оценка: 4 (1)
Здравствуйте, CiViLiS, Вы писали:

CVL>Понадобилось мне читать из бинарного файла двухбайтные слова. Для этого ввел новый тип typedef auto_value<unsigned short> word и перегрузил оператор >> для этого типа. Все было хорошо пока не перенес auto_value&lt;&gt;
Автор: Кодт
Дата: 16.01.03
в неймспас utils. После переноса istream_iterator отказался видеть перегруженный оператор.


А если поместить operator >> в пространство utils?
Кстати, ; при закрытии неймспейса не нужна.

CVL>Проверял на всех компиляторах: VS2005, gcc, comeau.


Почитать здесь
Re[2]: перегрузка оператора
От: CiViLiS Россия  
Дата: 07.09.06 09:32
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Почитать здесь

Спсибо за статью. Я теперь понял почему у меня не работает и как исправить. Только есть одно но. Мне не совсем нравиться это решение
Итак если вернуться к исходному коду:
namespace util
{
    class auto_value {};
    ... еще куча вспомагательных классов
}

// где то в коде
typedef utils::auto_value<unsigned short> word;
std::istream& operator >> (std::istream& stream, utils::word& w);
/*
Эти строчки не хочу вносить в utils так как word используется только в одном проекте, а сам utils в нескольких. 
В статье предлагается написать простой wrapper и тогда будет счастье, но этот враппер нельзя засунуть в utils :-(

Эх, придется копипастить этот врапер во все неймспейсы где потребуется :-( 
*/
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[3]: перегрузка оператора
От: Константин Л. Франция  
Дата: 07.09.06 09:35
Оценка:
Здравствуйте, CiViLiS, Вы писали:

CVL>Здравствуйте, night beast, Вы писали:


NB>>Почитать здесь

CVL>Спсибо за статью. Я теперь понял почему у меня не работает и как исправить. Только есть одно но. Мне не совсем нравиться это решение
CVL>Итак если вернуться к исходному коду:
CVL>
CVL>namespace util
CVL>{
CVL>    class auto_value {};
CVL>    ... еще куча вспомагательных классов
CVL>}

CVL>// где то в коде
CVL>typedef utils::auto_value<unsigned short> word;
CVL>std::istream& operator >> (std::istream& stream, utils::word& w);
CVL>/*
CVL>Эти строчки не хочу вносить в utils так как word используется только в одном проекте, а сам utils в нескольких. 
CVL>В статье предлагается написать простой wrapper и тогда будет счастье, но этот враппер нельзя засунуть в utils :-(

так заведи отдельный неймспейс, или внеси в другой, специфичный только для этого проекта

CVL>Эх, придется копипастить этот врапер во все неймспейсы где потребуется :-( 
CVL>*/
CVL>
Re[3]: перегрузка оператора
От: night beast СССР  
Дата: 07.09.06 10:12
Оценка: 6 (1)
Здравствуйте, CiViLiS, Вы писали:

NB>>Почитать здесь

CVL>Спсибо за статью. Я теперь понял почему у меня не работает и как исправить.

ну, спасибо наверное надо говорить Greg Zubankov.

CVL>Только есть одно но. Мне не совсем нравиться это решение

CVL>Итак если вернуться к исходному коду:
CVL>
CVL>typedef utils::auto_value<unsigned short> word;
CVL>std::istream& operator >> (std::istream& stream, utils::word& w);
CVL>


еще можно попробовать сделать word членом того-же неймспейса, что и оператор. (например наследованием)
Re[4]: перегрузка оператора
От: CiViLiS Россия  
Дата: 07.09.06 10:33
Оценка:
Здравствуйте, night beast, Вы писали:

NB>ну, спасибо наверное надо говорить Greg Zubankov.

ну тогда спасибо что дали ссылку на статью

NB>еще можно попробовать сделать word членом того-же неймспейса, что и оператор. (например наследованием)

за это отдельно сенкс -- работает.
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[4]: перегрузка оператора
От: Константин Л. Франция  
Дата: 07.09.06 10:52
Оценка:
Здравствуйте, Константин Л., Вы писали:

[]

так заведи отдельный неймспейс, или внеси в другой, специфичный только для этого проекта
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.