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

时间:2011-01-14 14:31:12

标签: pointers vector struct

#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;我收到了类似的错误。

5 个答案:

答案 0 :(得分:2)

你想这样做:

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

你正在做的是通过使用[]取消引用指针并抓住第0个偏移量,然后尝试取消引用非指针。

另一种方法(这只是丑陋):

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

答案 1 :(得分:2)

p_v_avector*,使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,您的回答是正确的,并且您展示了一个成功的解决方案,但它有点难以理解,答案就在最后。

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