#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-&gt; vector [] - &gt; vector [] - &gt; int;我收到了类似的错误。
答案 0 :(得分:2)
你想这样做:
cout << ((*p_v_a)[0]).z[4];
你正在做的是通过使用[]取消引用指针并抓住第0个偏移量,然后尝试取消引用非指针。
另一种方法(这只是丑陋):
cout << (p_v_a[0][0]).z[4];
答案 1 :(得分:2)
p_v_a
是vector*
,使p_v_a[0]
成为vector
(因为p_v_a[0]
等同于*(p_v_a+0)
),所以使用指向成员运算符(->
)不会对此起作用。您可能想要(*p_v_a)[0].z[4]
。
答案 2 :(得分:1)
当您在指针上使用索引[]
运算符时,它也会取消引用它。在非指针类型上使用中缀解除引用运算符->
,然后在您描述的错误中正确地生成。
答案 3 :(得分: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];
希望有所帮助。
答案 4 :(得分:0)
这让我感到烦恼 - 我设法得到了
std :: cout&lt;&lt; (nsNLs-&GT;背面())名称
工作,但我无法使索引数组引用工作,(即使是我不需要的parens)。
std :: cout&lt;&lt; ||这里?|| nsNLs ||这里?|| [intVal] ||这里?||名称
我试着围绕指向矢量的指针进行解除引用和括号的各种变化,而没有点击(||的东西指向|| passedVariable)[] .name
“”。因为在两个阶段的解引用结束时,我们正在查看结构的一个实例,而不是指向某个东西,只是一个具体的内存块。
@Mark,非常明确的解释,你带领一些有效的东西,并且操作非常不寻常,我对矢量对象取消引用和数组元素/指针取消引用周围的parens感觉更好。我看到了你的解决方案,尝试了它,并且它有效。
@Tomalek,您的回答是第二个最容易理解的问题,并在我的书中获得了一个额外的点,用于显示问题,逐步完成,解释错误,然后提出修复建议。比马克稍微运动,只有一套括号。
@ user470379,您的回答是正确的,并且您展示了一个成功的解决方案,但它有点难以理解,答案就在最后。
谢谢你们三个,我投票给你了。