Понадобилось мне читать из бинарного файла двухбайтные слова. Для этого ввел новый тип typedef auto_value<unsigned short> word и перегрузил оператор >> для этого типа. Все было хорошо пока не перенес auto_value<>
в неймспас 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>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Здравствуйте, CiViLiS, Вы писали:
CVL>Доброе время суток.
CVL>Понадобилось мне читать из бинарного файла двухбайтные слова. Для этого ввел новый тип typedef auto_value<unsigned short> word и перегрузил оператор >> для этого типа. Все было хорошо пока не перенес auto_value<>
Здравствуйте, CiViLiS, Вы писали:
CVL>Понадобилось мне читать из бинарного файла двухбайтные слова. Для этого ввел новый тип typedef auto_value<unsigned short> word и перегрузил оператор >> для этого типа. Все было хорошо пока не перенес auto_value<>
Здравствуйте, 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>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Здравствуйте, 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>
Здравствуйте, CiViLiS, Вы писали:
NB>>Почитать здесь CVL>Спсибо за статью. Я теперь понял почему у меня не работает и как исправить.
ну, спасибо наверное надо говорить Greg Zubankov.
CVL>Только есть одно но. Мне не совсем нравиться это решение CVL>Итак если вернуться к исходному коду: CVL>
Здравствуйте, night beast, Вы писали:
NB>ну, спасибо наверное надо говорить Greg Zubankov.
ну тогда спасибо что дали ссылку на статью
NB>еще можно попробовать сделать word членом того-же неймспейса, что и оператор. (например наследованием)
за это отдельно сенкс -- работает.
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз