使用指向结构向量的指针访问结构成员。错误:' - >'的基本操作数具有非指针类型
#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_a
是vector*
,使得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];
希望有所帮助。
这是推动我buggo-我会设法让
的std ::法院< <(nsNLs->回())。命名
的工作,但我不能让指数数组引用的工作,(即使与parens我不需要)。
的std ::法院< < ||这里?|| nsNLs || here?|| [intVal] || here?||命名
我试图dereferenceing和圆括号的指针向量周围的每一个变型中,没有击中上(||事情指向|| passedVariable)[]。名称
“”因为在两阶段解引用结束时,我们正在查看struct的一个实例,而不是任何指向某个东西的东西,只是一个具体的内存块。
@马克,非常清楚的解释,你带着一些有效的东西,而且操作是非常奇怪的,我感觉围绕矢量对象解引用和数组元素/指针解引用的效果更好。我看到了你的解决方案,尝试了它,并且工作。
@Tomalek,你的答案是第二个最容易遵循的,并在我的书中获得额外的一点来显示问题,一步一步地解释错误,然后提出修复建议。稍微比马克运动,只有一组括号。
@ user470379,你的回答是正确的,你展示了一个成功的解决方案,但它有点难以遵循,答案在最后。
谢谢你们三个人,我投票给你。
@Downvoter:请发表评论,解释downvotes,出于普通礼貌。 – 2011-01-22 13:09:31