类 std::vector<Object> 没有名为 'x' 的成员

Class std::vector<Object> has no member named 'x'

本文关键字:成员 gt vector std lt Object      更新时间:2023-10-16

当我试图编译类似以下内容时,会收到标题中提到的错误消息。

class Object{
 public:
  Object(){
   //Something
  }
  void x(){
   //Something
  }
}
void function(std::vector<Object>* things){
 int someNumber;
 //Some algorithm to get the value of someNumber.
 things->resize(someNumber);
 for(int i=0;i<someNumber;i++){
  things[i].x();
 }
}
int main(){
 vector<Object> things;
 function(&things);
 return 0;
}

是什么引起了麻烦?

您正在将指针传递给向量,因此当您使用[]时,它将things视为向量的数组

void function(std::vector<Object>* things)
{
    things[0]; // element of array of vectors (vector<Object>)
}

尝试通过引用传递矢量

void function(std::vector<Object>& things)
{
    things[0]; // element of passed in vector (Object)
}

C++中,当您在指针上使用[]时,它假设您正在访问数组,该数组的开头由指针指示。

因此,在您的情况下,假设您有一个向量数组,并且[]正在从该数组中选择一个向量。

您希望使用[]来访问向量的元素,因此在使用[]:之前,您需要通过引用来传入向量

vector<Object>* things;
(*things)[0]; // dereference the pointer then access the elements
void function(std::vector<Object>* things){
 int someNumber;
 //Some algorithm to get the value of someNumber.
 things->resize(someNumber);
 for(int i=0;i<someNumber;i++){
  things[i].x();
 }
}

things是一个指针。因为指针things[i]等于*(things+i),所以这不是您想要做的,您需要:

  (*things)[i].x();

或更详细:

  things->operator[]( i ).x();