使用指向结构向量的指针访问结构成员。错误:' - >'的基本操作数具有非指针类型

问题描述:

#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;我也遇到类似的错误。使用指向结构向量的指针访问结构成员。错误:' - >'的基本操作数具有非指针类型

你想这样做:

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

你在做什么,通过使用[],并抢得第0偏移,然后试图取消引用非指针引用指针。

另一种方式来做到这一点(这是刚难看):

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

p_v_avector*,使得p_v_a[0]一个vector(因为p_v_a[0]相当于*(p_v_a+0)),因此,使用指针构件运算符(-> )不会在这方面发挥作用。你可能想要(*p_v_a)[0].z[4]

当您使用索引[]操作上的指针,这也解引用它。对非指针类型使用中缀解除引用运算符->,然后在您描述的错误中正确返回结果。

在下面:

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

这是推动我buggo-我会设法让

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

的工作,但我不能让指数数组引用的工作,(即使与parens我不需要)。

的std ::法院< < ||这里?|| nsNLs || here?|| [intVal] || here?||命名

我试图dereferenceing和圆括号的指针向量周围的每一个变型中,没有击中上(||事情指向|| passedVariable)[]。名称

“”因为在两阶段解引用结束时,我们正在查看struct的一个实例,而不是任何指向某个东西的东西,只是一个具体的内存块。

@马克,非常清楚的解释,你带着一些有效的东西,而且操作是非常奇怪的,我感觉围绕矢量对象解引用和数组元素/指针解引用的效果更好。我看到了你的解决方案,尝试了它,并且工作。

@Tomalek,你的答案是第二个最容易遵循的,并在我的书中获得额外的一点来显示问题,一步一步地解释错误,然后提出修复建议。稍微比马克运动,只有一组括号。

@ user470379,你的回答是正确的,你展示了一个成功的解决方案,但它有点难以遵循,答案在最后。

谢谢你们三个人,我投票给你。