Вопрос про std::advance
От: XJess  
Дата: 08.04.11 12:38
Оценка:
Привет всем!
В книге Леена Аммерааля написано, что std::advance применим ко всем типам итераторов. В следующем коде на advance выдается ошибка
"Error 1 error C2665: 'std::_Advance' : none of the 4 overloads could convert all the argument types"

хотя i++ компилируется, правда вывод происходит так же, как и без инкремента.


struct MyStruct {
    long nr;
    char name [30];
    bool operator < (const MyStruct& rhs)
    {
        return strcmp(name, rhs.name) < 0;
    }
};

std::ostream& operator << (std::ostream& s, const MyStruct& ms)
{
    s << ms.nr << " " << ms.name;
    return s;
}

MyStruct a [] =
{
    {10, "Anna"},
    {11, "Bunny"},
    {16, "Cat"},
    {28, "Susan"},
};

std::ostream_iterator<MyStruct> i(cout, " ");
i++;
//std::advance(i, 10);
std::copy(a, a + sizeof(a) / sizeof(a[0]), i);


Компилятор — VС 2008.

Объясните, плиз.
Re: Вопрос про std::advance
От: Vamp Россия  
Дата: 08.04.11 12:50
Оценка: 2 (1) +1
XJ>В книге Леена Аммерааля написано, что std::advance применим ко всем типам итераторов.
Я сильно подозреваю, что Леен забыл про стрим итераторы, и имел в виду итераторы по контейнерам.

XJ>"Error 1 error C2665: 'std::_Advance' : none of the 4 overloads could convert all the argument types"

И это правильно.

XJ>хотя i++ компилируется, правда вывод происходит так же, как и без инкремента.

А чего бы ты ожидала? Какое поведение программы тебе бы казалось разумным?
Да здравствует мыло душистое и веревка пушистая.
Re: Вопрос про std::advance
От: баг  
Дата: 08.04.11 12:54
Оценка: 2 (1) +1
Здравствуйте, XJess, Вы писали:

XJ>Объясните, плиз.

advance() работает только с InputIterator и производных от него.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.