2011-01-14 65 views
0
#include <iostream> 
#include <vector> 

using namespace std; 

struct s_Astruct { 
    vector <int> z; 
}; 


int main() 
{ 

    vector <s_Astruct> v_a; 

    for(int q=0;q<10;q++) 
    { 
     v_a.push_back(s_Astruct()); 
     for(int w =0;w<5;w++) 
      v_a[q].z.push_back(8); 
    } 

    vector <s_Astruct> * p_v_a = & v_a; 
    cout << p_v_a[0]->z[4]; //error: base operand of '->' has non-pointer type 
        //'__gnu_debug_def::vector<s_Astruct, std::allocator<s_Astruct> >' 


} 

這種操作似乎存在一些問題,我不明白。在我正在處理的代碼中,我實際上有類似p_class-> vector [] - > vector [] - > int;我也遇到類似的錯誤。使用指向結構向量的指針訪問結構成員。錯誤:' - >'的基本操作數具有非指針類型

回答

2

你想這樣做:

cout << ((*p_v_a)[0]).z[4]; 

你在做什麼,通過使用[],並搶得第0偏移,然後試圖取消引用非指針引用指針。

另一種方式來做到這一點(這是剛難看):

cout << (p_v_a[0][0]).z[4]; 
2

p_v_avector*,使得p_v_a[0]一個vector(因爲p_v_a[0]相當於*(p_v_a+0)),因此,使用指針構件運算符(-> )不會在這方面發揮作用。你可能想要(*p_v_a)[0].z[4]

1

當您使用索引[]操作上的指針,這也解引用它。對非指針類型使用中綴解除引用運算符->,然後在您描述的錯誤中正確返回結果。

1

在下面:

vector<s_Astruct>* p_v_a = &v_a; 
cout << p_v_a[0]->z[4] 

你有一個指針向量,但你試圖調用operator[]之前沒有解引用該指針。然後,您嘗試在索引0處取消引用s_Astruct,但這不是指針。

試試這個:

vector<s_Astruct>* p_v_a = &v_a; 
cout << (*p_v_a)[0].z[4]; 

希望有所幫助。

+0

@Downvoter:請發表評論,解釋downvotes,出於普通禮貌。 – 2011-01-22 13:09:31

0

這是推動我buggo-我會設法讓

的std ::法院< <(nsNLs->回())。命名

的工作,但我不能讓指數數組引用的工作,(即使與parens我不需要)。

的std ::法院< < ||這裏?|| nsNLs || here?|| [intVal] || here?||命名

我試圖dereferenceing和圓括號的指針向量周圍的每一個變型中,沒有擊中上(||事情指向|| passedVariable)[]。名稱

「」因爲在兩階段解引用結束時,我們正在查看struct的一個實例,而不是任何指向某個東西的東西,只是一個具體的內存塊。

@馬克,非常清楚的解釋,你帶着一些有效的東西,而且操作是非常奇怪的,我感覺圍繞矢量對象解引用和數組元素/指針解引用的效果更好。我看到了你的解決方案,嘗試了它,並且工作。

@Tomalek,你的答案是第二個最容易遵循的,並在我的書中獲得額外的一點來顯示問題,一步一步地解釋錯誤,然後提出修復建議。稍微比馬克運動,只有一組括號。

@ user470379,你的回答是正確的,你展示了一個成功的解決方案,但它有點難以遵循,答案在最後。

謝謝你們三個人,我投票給你。