简体   繁体   中英

C++ iterator for vector of struct Compiler Error

I created a struct type which contains two variables. I use this data type within a vector , that is again stored in a map , as following:

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;

When I try to use an iterator, such as

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

the compiler gives this error:

error: no viable conversion from '__wrap_iter< A *>' to '__wrap_iter< std::__1::vector < A, std::__1::allocator< A> > *>' std::vector< LA>::iterator it = b[x].begin();

candidate constructor (the implicit copy constructor) not viable: no known conversion from 'iterator' (aka '__wrap_iter< pointer>') to 'const std::__1::__wrap_iter< std::__1::vector< A, > std::__1::allocator< A> > *> &' for 1st argument class__wrap_iter

candidate constructor (the implicit move constructor) not viable: no known conversion from 'iterator' (aka > '__wrap_iter< pointer>') to 'std::__1::__wrap_iter< std::__1::vector< A, > std::__1::allocator< A> > *> &&' for 1st argument class__wrap_iter

candidate template ignored: disabled by 'enable_if'

What is the reason for this error? Although I tried several things like operator overloading, I could not solve this. Any help is appreciated.

You don't have a vector of LA ; you have a vector of A . So:

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

or:

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

Looks like a simple typo to me?

(Not very surprising given these terrible type names...)

The part that goes inside the <> in a std::vector<> is the type of the object that the vector is going to hold, eg, std::vector<int> or std::vector<double> . In your case the type of object in the vector is A . So you should write

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

or using your typedef ,

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

The others here have already answered why the compiler complained.

So I will not repeat that but give an alternative "fix". It'll only work if you can use C++11 syntax in your project/environment.

If so, the iterator can be created as follows:

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

This is not as explicit as when specifiying the exact type for it , but at least it's less typing. Note that this will only work in C++11 or higher, and you will need to compile with -std=c++11 in g++. Visual Studio 2013 and higher will understand that syntax out of the box.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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