C ++, std :: copy и шаблоны - PullRequest
2 голосов
/ 23 мая 2011

Я делаю эксперименты с шаблонами и STL.Это мой тестовый код ...

template <typename Item>
struct TList
{
    typedef std::vector <Item> Type;
};

template <typename Item>
class Cont
{
private:
    typename TList <Item>::Type elements;

public:
    void push_back ( const Item & p ) {elements.push_back ( p );}

    typename TList <Item>::Type ::iterator
        copy (typename TList <Item>::Type ::iterator first,
                typename TList <Item>::Type ::iterator last,
                typename TList <Item>::Type ::iterator result) 
        {
            elements.resize(elements.size() + last - first);  //Exception
            return copy ( first, last, result ); 
        }

        typename TList <Item>::Type ::iterator begin() { return elements.begin(); }
};

Но во время операции копирования

int main()
{
    Cont <double> cont;
    cont.push_back(1);
    cont.push_back(2);

    TList <double>::Type v;
    v.push_back(3);
    v.push_back(4);
    cont.copy(v.begin(), v.end(), cont.begin());  //Exception
    cont.copy(v.begin(), v.end(), cont.end());  //Exception

    return 0;
}

программа вызывает исключение времени выполнения.Не могли бы вы помочь мне найти ошибку?

Exception: Vector iterator + offset out of range...

Ответы [ 2 ]

7 голосов
/ 23 мая 2011

Выражение:

elements.size() + last - first

оценивается как:

(elements.size() + last) - first

Результатом первого добавления будет итератор, превышающий границы вектора, который вызывает исключение (врежим отладки).Вы можете попробовать это:

elements.size() + (last - first)

Или более STL-подобный подход:

elements.size() + std::distance(first, last)
0 голосов
/ 23 мая 2011

Проблема вызвана тем, что ваш метод copy изменяет размер вектора, что делает итератор, который вы передали, недействительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...