[英]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.