C++向量结构体的迭代器编译错误。

5

我创建了一个包含两个变量的struct类型。我在一个vector中使用这个数据类型,然后再将它存储在一个map中:

struct A {
    int x;
    Y y;
    A() {};
    A(int _x, Y _y) { x=_x, y=_y; };
};

typedef std::vector<A> LA;
typedef std::map<uint,LA> MB;

MB b;

当我尝试使用迭代器时,例如

std::vector<LA>::iterator it = b[x].begin();

编译器报错如下:
错误:从 '__wrap_iter< A *>' 到 '__wrap_iter< std::__1::vector < A, std::__1::allocator< A> > *>' 的转换无法实现 std::vector< LA>::iterator it = b[x].begin(); 候选构造函数(隐式复制构造函数)不可用:没有已知的转换,从 'iterator'(即 '__wrap_iter< pointer>')到 'const std::__1::__wrap_iter< std::__1::vector< A, > std::__1::allocator< A> > *> &' 的第一个参数 class__wrap_iter 候选构造函数(隐式移动构造函数)不可用:没有已知的转换,从 'iterator'(即 '__wrap_iter< pointer>')到 'std::__1::__wrap_iter< std::__1::vector< A, > std::__1::allocator< A> > *> &&' 的第一个参数 class__wrap_iter 候选模板被忽略:被 'enable_if' 禁用
这个错误的原因是什么?虽然我尝试了几种方法,比如运算符重载,但是我还是解决不了这个问题。希望能得到帮助。

1
建议:LA::iterator it = b[x].begin(); - paulsm4
@paulsm4:我已经说过了。在答案部分。那才是它应该呆的地方! - Lightness Races in Orbit
3个回答

9

您没有一个LA的向量; 您有一个A的向量。 因此:

std::vector<A>::iterator it = b[x].begin();

或者:

LA::iterator it = b[x].begin();

看起来对我来说只是简单的错字?

(这些可怕的类型名称,这并不令人感到意外...)


谢谢您的回答。这个方法很好用!如此简单的解决方案。 - LikeMusic

3
其他人已经回答了编译器为什么会抱怨的原因。所以我不再重复,而是提供一种替代“解决方案”。如果你的项目/环境允许使用C++11语法,那么就可以创建迭代器如下:
auto it = b[x].begin();

这种方式不如为it指定确切类型那么明确,但至少打字少了。请注意,这仅适用于C++11或更高版本,并且您需要在g++编译器中使用-std=c++11选项进行编译。Visual Studio 2013和更高版本将默认支持这种语法。


1

std::vector<A>是一个存储对象的向量,<>中的部分表示该向量将要保存的对象类型,例如std::vector<int>std::vector<double>。在您的情况下,向量中的对象类型为A,因此您应该编写:

std::vector<A>::iterator it = b[x].begin();

或者使用您的typedef
LA::iterator is = b[x].begin();

1
你说了一些话,不完全是我写的。 - nonremovable
我认为很明显原帖作者知道向量是什么,但好吧。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接