C ++模板和STL向量问题

时间:2011-01-18 13:35:27

标签: c++ templates stl iterator typename

我在简单的事情上需要帮助

我正在尝试创建课程

#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 个答案:

答案 0 :(得分:7)

使用

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

因为ab是const引用,所以调用begin的const版本,它返回const_iterator,而不是iterator。您无法将const_iterator分配给iterator,就像您无法将指针指定给const指针一样。

答案 1 :(得分:3)

typename vector<T>::iterator A;

应该是

typename vector<T>::const_iterator A;

B

相同

更新

我的C ++技能很生疏,但是

因为传递给merge的两个vectors是const引用,所以不能使用标准迭代器移过它们,因为标准迭代器允许你修改向量的内容。因此,您必须使用const_iterator,这将不允许您修改矢量内容。

道歉,如果我的C ++ Fu没有达到标准,我记得有足够的C ++来解决这个问题,但是我没有在愤怒中使用过C ++。 。 。哇7年(它真的那么长吗?告诉我,但我已经老了)。

正如我所说,如果你能提供更好的解释,请随时编辑这个答案。

答案 2 :(得分:0)

你正在混淆带有decaration的typedef。

如果要声明具有依赖类型的typedef,则需要使用typename关键字:

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

BTW,即使没有typedef,也需要typename。