2015-08-25 67 views
3

我創建了一個包含兩個變量的struct類型。我使用的是vector內這個數據類型,再存入一個map,如下:結構編譯器錯誤的向量的C++迭代器

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(); 

編譯器給出了這樣的錯誤:

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'

這個錯誤的原因是什麼?儘管我嘗試了幾個操作符重載的東西,但我無法解決這個問題。任何幫助表示讚賞。

+1

建議:'LA :: iterator it = b [x] .begin();' – paulsm4

+0

@ paulsm4:我已經說過了。在答案部分。它屬於哪裏! –

回答

6

你還沒有載體LA;你有一個向量A。所以:

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

或:

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

看起來像一個簡單的拼寫錯誤給我嗎?

(不是很奇怪,因爲這些可怕的類型名稱...)

+0

謝謝你的回答。這工作正常!這種簡單的解決方案。 – LikeMusic

2

,在一個std::vector<><>裏面去的部分是對象的矢量將要舉辦,例如,std::vector<int>std::vector<double>類型。在你的情況下,向量中的對象類型A。所以,你應該寫

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

或使用typedef

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

說這已經 –

+1

你說了一些,但不完全是我寫的。 – nonremovable

+0

我認爲OP很清楚OP知道向量是什麼,但沒關係 –

2

其他人在這裏已經回答了爲什麼編譯器抱怨。

所以我不會重複,但給一個替代「修復」。它只會在你的項目/環境中使用C++ 11語法時才起作用。

如果是這樣,迭代器可以創建如下:

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

這不是specifiying時it確切類型,但至少減少了擊鍵次數爲顯式。請注意,這隻適用於C++ 11或更高版本,您需要使用g ++編譯爲-std=c++11。 Visual Studio 2013及更高版本會理解這種開箱即用的語法。