繁体   English   中英

struct Compiler Error向量的C ++迭代器

[英]C++ iterator for vector of struct Compiler Error

我创建了一个包含两个变量的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'禁用

这个错误的原因是什么? 虽然我尝试了几个像运算符重载的东西,但我无法解决这个问题。 任何帮助表示赞赏。

你没有LA的载体; 你有一个A的向量。 所以:

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

要么:

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

看起来像一个简单的错字给我?

(鉴于这些可怕的类型名称,这并不奇怪...)

std::vector<>中进入<>内部的部分是向量将要保存的对象的类型,例如std::vector<int>std::vector<double> 在您的情况下,向量中的对象类型A 所以你应该写

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

或者使用你的typedef

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

这里的其他人已经回答了编译器抱怨的原因。

所以我不会重复这一点,而是提供另一种“修复”。 只有在项目/环境中使用C ++ 11语法时,它才有效。

如果是这样,可以按如下方式创建迭代器:

auto it = b[x].begin();

这不是specifiying所需的确切类型时那样明确it ,但至少减少了击键次数。 请注意,这只适用于C ++ 11或更高版本,您需要使用-std=c++11以g ++编译。 Visual Studio 2013及更高版本将了解开箱即用的语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM