You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用指向vector的指针访问成员时报编译错误求解

问题根源

两个报错完全是C++运算符优先级和指针成员访问语法没记牢导致的,和vector本身的用法无关:

  • 写*pointerr.size()的时候,.运算符优先级比解引用*高,编译器会先尝试给指针变量pointerr本身调用size()方法——但指针只是个存地址的变量,根本没有成员方法,所以直接报第一个错,提示你指针访问成员应该用->。
  • 写*pointerr->size()的时候,->的优先级也比*高,编译器会先正常执行pointerr->size()拿到vector的长度(一个无符号整数),然后你又给这个整数加了解引用*,整数不是指针当然没法解引用,就出了第二个错。
正确写法

两种写法效果完全一致,按需选就行:

  • 用指针专属的成员访问符->,这也是最常用的写法,不需要额外加解引用符号:
// 拿长度
size_t vec_size = pointerr->size();
// 访问元素、调用其他方法逻辑完全一样
int16_t first_elem = pointerr->at(0);
pointerr->push_back(10);

->本身的语义就是解引用指针 + 访问指向对象的成员,多写额外的*反而会出错。

  • 如果习惯用和普通对象一样的.访问成员,必须给解引用的部分加小括号,强制先解引用拿到vector实例,再调用方法:
size_t vec_size = (*pointerr).size();
int16_t first_elem = (*pointerr).at(0);
额外提醒

你现在定义的指针是std::vector<int16_t>*类型,只能指向存int16_t元素的vector,不能直接指向你代码里写的std::vector<float> speedData,类型不匹配会直接编译失败。如果确实需要在两个不同元素类型的vector之间切换活跃对象,普通类型指针做不到,可以用std::variant包装两种vector的指针,或者把通用处理逻辑写成模板函数,别强行转指针类型,容易跑出无法预期的问题。
如果你的场景里不需要切换指针指向的目标,也可以用引用来代替指针,引用访问成员直接用.就行,语法更简洁,但引用初始化之后就不能改绑到其他对象,适合固定指向某一个vector的场景。


内容的提问来源于stack exchange,提问作者Bjarke Lund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:45:29