C++ 如何在C++;?

C++ 如何在C++;?,c++,kinect,libfreenect2,C++,Kinect,Libfreenect2,我想使以下侦听器可用于我的getFrames()函数。我该怎么做?我尝试将监听器添加到我的私有字段,但在监听器(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir)上仍然出现以下错误: 对“(libfreenect2::SyncMultiFrameListener)(int)的调用不匹配 请看一下示例应用程序代码 源文件: int KinectConnector::connect()

我想使以下侦听器可用于我的
getFrames()
函数。我该怎么做?我尝试将监听器添加到我的私有字段,但在
监听器(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir)上仍然出现以下错误

对“(libfreenect2::SyncMultiFrameListener)(int)的调用不匹配

请看一下示例应用程序代码

源文件:

int KinectConnector::connect() {
    //! [listeners]
    listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);

    dev->setColorFrameListener(&listener);
    dev->setIrAndDepthFrameListener(&listener);     
}

void KinectConnector::getFrames() {
    while (!protonect_shutdown) {
        listener.waitForNewFrame(frames);
    }
}
class KinectConnector {
public:
    KinectConnector();
    virtual ~KinectConnector();
    int connect();
    void getFrames();
private:
    libfreenect2::SyncMultiFrameListener listener
    libfreenect2::FrameMap frames;
};
/// [listeners]
  int types = 0;
  if (enable_rgb)
    types |= libfreenect2::Frame::Color;
  if (enable_depth)
    types |= libfreenect2::Frame::Ir | libfreenect2::Frame::Depth;
  libfreenect2::SyncMultiFrameListener listener(types);
  libfreenect2::FrameMap frames;

  dev->setColorFrameListener(&listener);
  dev->setIrAndDepthFrameListener(&listener);
/// [listeners]
头文件:

int KinectConnector::connect() {
    //! [listeners]
    listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);

    dev->setColorFrameListener(&listener);
    dev->setIrAndDepthFrameListener(&listener);     
}

void KinectConnector::getFrames() {
    while (!protonect_shutdown) {
        listener.waitForNewFrame(frames);
    }
}
class KinectConnector {
public:
    KinectConnector();
    virtual ~KinectConnector();
    int connect();
    void getFrames();
private:
    libfreenect2::SyncMultiFrameListener listener
    libfreenect2::FrameMap frames;
};
/// [listeners]
  int types = 0;
  if (enable_rgb)
    types |= libfreenect2::Frame::Color;
  if (enable_depth)
    types |= libfreenect2::Frame::Ir | libfreenect2::Frame::Depth;
  libfreenect2::SyncMultiFrameListener listener(types);
  libfreenect2::FrameMap frames;

  dev->setColorFrameListener(&listener);
  dev->setIrAndDepthFrameListener(&listener);
/// [listeners]
示例应用程序来源:

int KinectConnector::connect() {
    //! [listeners]
    listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);

    dev->setColorFrameListener(&listener);
    dev->setIrAndDepthFrameListener(&listener);     
}

void KinectConnector::getFrames() {
    while (!protonect_shutdown) {
        listener.waitForNewFrame(frames);
    }
}
class KinectConnector {
public:
    KinectConnector();
    virtual ~KinectConnector();
    int connect();
    void getFrames();
private:
    libfreenect2::SyncMultiFrameListener listener
    libfreenect2::FrameMap frames;
};
/// [listeners]
  int types = 0;
  if (enable_rgb)
    types |= libfreenect2::Frame::Color;
  if (enable_depth)
    types |= libfreenect2::Frame::Ir | libfreenect2::Frame::Depth;
  libfreenect2::SyncMultiFrameListener listener(types);
  libfreenect2::FrameMap frames;

  dev->setColorFrameListener(&listener);
  dev->setIrAndDepthFrameListener(&listener);
/// [listeners]
根据观察:

listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
将导致编译错误。当您试图使用标志调用
侦听器的
()(int)运算符时,显然
侦听器
对象没有为其定义
()(int)运算符

因此,错误消息:

对“(libfreenect2::SyncMultiFrameListener)(int)的调用不匹配

您在这里所做的是尝试用这些标志构造侦听器。只能在类的构造函数中执行该表达式,除非
libfreenect2::SyncMultiFrameListener
具有用于此目的的运算符()

只需浏览libfreenect2::SyncMultiFrameListener的
没有可用的默认构造函数。这意味着您需要在初始化或构造时提供标志

差异

请注意这两个代码之间的差异:

// listener declared with types as shown in Github Example
// calls the libfreenect2::SyncMultiFrameListener(int) constructor
libfreenect2::SyncMultiFrameListener listener(types);

// Essentially what your code does is this, 
// when you declare in the header file without initializing in the constructor
// calls the libfreenect2::SyncMultiFrameListener() constructor which don't exists
libfreenect2::SyncMultiFrameListener listener2();
您可以在构造函数下阅读更多内容

有几种方法可以解决此问题:

在表达式中初始化

进行以下更改:

标题:

class KinnectConnector
{
    ...
private:
    libfreenect2::SyncMultiFrameListener* listener;
    ...
};
资料来源:

int KinectConnector::connect() {
    listener = new libfreenect2::SyncMultiFrameListener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
    ...
}
*使用
delete listener后记得删除在析构函数或其他地方

在构造函数中初始化

当构造
KinnectConnector
时,请执行以下操作初始化
侦听器

KinectConnector::KinectConnector()
: listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir)
{
    ...
}

为了安全起见,最好使用构造函数示例,但这取决于您的用例。

您的“修复”不起作用,但“由构造函数”修复了它。非常感谢。是的,刚刚发现“修复”不起作用,因为没有可用的默认构造函数。如果您想以原始方式编写代码,则必须通过带有“new”的指针来完成。我已经更新了示例以供参考。尽管我不推荐它,除非有一个强大的用例,因为它容易出错。