Шаблоны C ++ и векторная проблема STL - PullRequest
1 голос
/ 18 января 2011

Мне нужна помощь в простом деле

Я пытаюсь создать класс

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<class T> class merge_sort
{
protected:

    vector<T> merge(const vector<T> &a, const vector<T> &b)
    {
        vector<T> v;

        typename vector<T>::iterator A;
        A= a.begin();
        typename vector<T>::iterator B;
        B= b.begin();
...

но компилятор выдает мне следующую ошибку:

no match for ‘operator=’ in ‘A = ((const std::vector<int, std::allocator<int> >*)a)->std::vector<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator<int>]()’  merge.cpp   /merge_sort line 23 C/C++ Problem

Ответы [ 3 ]

7 голосов
/ 18 января 2011

Использование

typename vector<T>::const_iterator A = a.begin();
typename vector<T>::const_iterator B = b.begin();

, поскольку a и b являются константными ссылками, вызывается константная версия begin, которая возвращает const_iterator, а не iterator. Вы не можете назначить const_iterator s iterator s, как вы не можете назначить указатели на const указателям.

3 голосов
/ 18 января 2011
typename vector<T>::iterator A;

Должно быть

typename vector<T>::const_iterator A;

То же самое для B

Обновление

Мои навыки C ++ ржавые, но

Поскольку два vectors, переданные для слияния, являются константными ссылками, вы не можете использовать стандартный итератор для перемещения по ним, потому что стандартный итератор позволяет изменять содержимое вектора. Следовательно, вы должны использовать const_iterator, что не позволит вам изменять векторное содержимое.

Извиняюсь, если мой C ++ Fu не на пустом месте, я помню достаточно C ++, чтобы решить проблему, но не использовал C ++ в гневе. , , вау 7 лет (неужели это так долго? Убей меня, но я старею).

Как я уже сказал, не стесняйтесь редактировать этот ответ, если вы можете дать более подробные объяснения.

0 голосов
/ 18 января 2011

Вы путаете определение типа с декарацией.

Если вы хотите объявить typedef с зависимым типом, вам нужно использовать ключевое слово typename:

typedef typename vector<T>::const_iterator iter
iter A = a.begin( );
iter B = b.begin( );

Кстати, typename требуется даже без typedef.

...