编译错误C++:不能调用对象函数

编译错误C++:不能调用对象函数,c++,C++,我在下面的主文件中尝试创建一个具有预定义值的映射,并将其传递给其他方法进行进一步处理。主文件如下所示: int main(){ map<id,Porto> _portoInit; id = 1; Porto p; p.val = 5; _portoInit.insert(pair<id, Porto>(id, p)); Porto::setPorto(_portoInit); return 1; } 其中,setPorto在一个类下

我在下面的主文件中尝试创建一个具有预定义值的映射,并将其传递给其他方法进行进一步处理。主文件如下所示:

int main(){
  map<id,Porto> _portoInit;

  id = 1;

  Porto p;
  p.val = 5;

  _portoInit.insert(pair<id, Porto>(id, p));

  Porto::setPorto(_portoInit);

  return 1;
}
其中,setPorto在一个类下定义,如下所示,在单独的文件中

void Porto::setPorto( const map<id,Porto>&  _portoblock ) {
   //do stuffs
};
我收到一个错误提示:无法调用成员函数。。。毫无目的
我不是已经在主文件中声明了_portoInit的对象了吗?或者这是一种错误的声明方式?

您需要通过实际对象调用该方法:

p.setPorto(_portoInit);

除非setPorto是静态方法,否则代码无效。

您需要通过实际对象调用该方法:

p.setPorto(_portoInit);
除非setPorto是一个静态方法,否则您的代码无效。

setPorto是一个非静态成员函数,所以您需要在Porto实例上调用它。例如:

p.setPorto(_portoInit);
请注意,非静态成员函数采用隐式的第一个参数,可能是cv限定类型T*,因此您可以这样调用它:

Porto::setPorto(&p, _portoInit);
在这两种情况下,都需要一个对象来调用其上的成员函数。这就是编译器告诉您的。

setPorto是一个非静态成员函数,因此您需要在Porto实例上调用它。例如:

p.setPorto(_portoInit);
请注意,非静态成员函数采用隐式的第一个参数,可能是cv限定类型T*,因此您可以这样调用它:

Porto::setPorto(&p, _portoInit);
在这两种情况下,都需要一个对象来调用其上的成员函数。这就是编译器告诉您的。

您应该编写

p.setPorto(_portoInit);
::定义了函数的作用域,在上面是隐式的,因为调用函数的对象是一个端口。

您应该编写

p.setPorto(_portoInit);
::定义了函数的作用域,并且在上面是隐式的,因为调用函数的对象是一个Porto