"No matching functions to call to"发生在C++的构造函数上

"No matching functions to call to" happen to constructors in C++

本文关键字:to C++ 构造函数 No matching functions call      更新时间:2023-10-16

这是我在程序中遇到的C++构造函数问题。

问题发生在这里,程序中没有检测到cyclical_的构造函数。此处

pcl::gpu::kinfuLS::KinfuTracker::KinfuTracker 
(   const Eigen::Vector3f &volume_size, const float shiftingDistance, 
    int rows, int cols) : 
    //
    // error lies here, no matching function for cyclical_()
    //
        cyclical_( DISTANCE_THRESHOLD, VOLUME_SIZE, VOLUME_X ),  
        rows_(rows), cols_(cols), global_time_(0), max_icp_distance_(0), 
        integration_metric_threshold_(0.f), 
        perform_last_scan_ (false), finished_(false), lost_ (false), 
        disable_icp_ (false), perform_segmentation_(false)
{
  ....
}

cyclical_类被很好地定义和引用。它的定义如下。完整的原件在这里。https://github.com/lvzhaoyang/pcl/blob/master/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/kinfu.h我在程序中添加了一些参数,但没有更改任何与CyclicalBuffer相关的内容。

CyclicalBuffer cyclical_;
CyclicalBuffer object_cyclical_; // another member of type CyclicalBuffer, but the error shows the former one, not this one. Someone say it might affect.
enum { VOLUME_X = 512, VOLUME_Y = 512, VOLUME_Z = 512 };
const float VOLUME_SIZE = 3.0f;
const float DISTANCE_THRESHOLD = 1.5f;

CyclicalBuffer类的定义如下。原件在这里:https://github.com/lvzhaoyang/pcl/blob/master/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h这部分我没有改变任何东西。

namespace pcl
{
namespace gpu
{
namespace kinfuLS
{ 
  class PCL_EXPORTS CyclicalBuffer
  {
    public:
      CyclicalBuffer (const double distance_threshold, const double cube_size = 3.f, const int nb_voxels_per_axis = 512)
      {
        distance_threshold_ = distance_threshold;
        buffer_.volume_size.x = cube_size; 
        buffer_.volume_size.y = cube_size; 
        buffer_.volume_size.z = cube_size;
        buffer_.voxels_size.x = nb_voxels_per_axis; 
        buffer_.voxels_size.y = nb_voxels_per_axis; 
        buffer_.voxels_size.z = nb_voxels_per_axis; 
      }
      CyclicalBuffer (const double distance_threshold, const double volume_size_x, const double volume_size_y, const double volume_size_z, const int nb_voxels_x, const int nb_voxels_y, const int nb_voxels_z)
      {
        distance_threshold_ = distance_threshold;
        buffer_.volume_size.x = volume_size_x; 
        buffer_.volume_size.y = volume_size_y; 
        buffer_.volume_size.z = volume_size_z;
        buffer_.voxels_size.x = nb_voxels_x; 
        buffer_.voxels_size.y = nb_voxels_y; 
        buffer_.voxels_size.z = nb_voxels_z; 
      }
  ...
}
}
};

但当我编译这个问题时,它会给出这样的错误:

/home/lv/pcl-trunk/gpu/kinfu_large_scale/src/kinfu.cpp: In constructor ‘pcl::gpu::kinfuLS::KinfuTracker::KinfuTracker(const Vector3f&, float, int, int)’:
/home/lv/pcl-trunk/gpu/kinfu_large_scale/src/kinfu.cpp:85:53: error: no matching function for call to ‘pcl::gpu::kinfuLS::CyclicalBuffer::CyclicalBuffer()’
/home/lv/pcl-trunk/gpu/kinfu_large_scale/src/kinfu.cpp:85:53: note: candidates are:
/home/lv/pcl-trunk/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h:96:11: note: pcl::gpu::kinfuLS::CyclicalBuffer::CyclicalBuffer(double, double, double, double, int, int, int)
/home/lv/pcl-trunk/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h:96:11: note:   candidate expects 7 arguments, 0 provided
/home/lv/pcl-trunk/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h:75:11: note: pcl::gpu::kinfuLS::CyclicalBuffer::CyclicalBuffer(double, double, int)
/home/lv/pcl-trunk/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h:75:11: note:   candidate expects 3 arguments, 0 provided
/home/lv/pcl-trunk/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h:65:25: note: pcl::gpu::kinfuLS::CyclicalBuffer::CyclicalBuffer(const pcl::gpu::kinfuLS::CyclicalBuffer&)
/home/lv/pcl-trunk/gpu/kinfu_large_scale/include/pcl/gpu/kinfu_large_scale/cyclical_buffer.h:65:25: note:   candidate expects 1 argument, 0 provided

我没有完全理解候选者需要3个参数的错误,提供了0个。我认为我提供了正确数量的论据,所有内容都有明确的参考。

谢谢你讨论我的问题。我想我找到了一些线索,但我不知道为什么。问题可能出在CyclicalBuffer类型的第二个成员上。

CyclicalBuffer cyclical_;
CyclicalBuffer object_cyclical_; // when I comment everything related to this. The error disappears.

这看起来很奇怪。我不知道第二个成员怎么会在第一个成员身上出错。如果问题是object_cyclical_没有正确构造,为什么它会在cyclical_上报告错误?为了确保,错误报告行85是循环_(DISTANCE_THRESHOLD,VOLUME_SIZE,VOLUME_X)的行

有人能帮我指出潜在的问题吗?

将事物拼凑在一起,我认为您所拥有的是(通过暂时省略一些名称空间位来简化):

class KinfuTracker
{ // ....
  CyclicalBuffer cyclical_;
  CyclicalBuffer object_cyclical_;
  // ....
};
KinfuTracker::KinfuTracker(/*arguments left out for simplicity*/) : 
   cyclical_( DISTANCE_THRESHOLD, VOLUME_SIZE, VOLUME_X ),
   /* other member constructor/initializer bits */
{ // ......
}

我认为造成你问题的不是cyclical_,而是object_cyclical_object_cyclical_没有出现在构造函数/初始值设定项列表中,因此它是通过您尚未实现的默认构造函数构造的。

CyclicalBuffer提供一个默认构造函数,设置合理的默认值,或者在KinfoTracker类中显式构造object_cyclical_成员。

正如Todd Murray在评论中提到的那样,CyclicalBuffer cyclical_;行调用了一个没有参数的构造函数CyclicalBuffer()。由于您的代码没有定义具有零参数的默认构造函数,因此编译器不会隐式定义默认构造函数。当您简单地声明cyclical_时,这会导致一个错误。因此,您需要创建一个零参数构造函数,或者更改代码,以便在声明cyclical_时使用正确数量的参数初始化它。

示例:

简单地切换一些代码并添加正确的构造就可以生成一个有效的代码。

enum { VOLUME_X = 512, VOLUME_Y = 512, VOLUME_Z = 512 };
const float VOLUME_SIZE = 3.0f;
const float DISTANCE_THRESHOLD = 1.5f;
CyclicalBuffer cyclical_ = new CyclicalBuffer(DISTANCE_THRESHOLD, VOLUME_SIZE, VOLUME_X);

在代码的某个地方,您可以调用CyclicalBuffer的默认构造函数(无参数):

no matching function for call to 
‘pcl::gpu::kinfuLS::CyclicalBuffer::CyclicalBuffer()’

但是类CCD_ 12没有这样的构造函数。

编译器只能找到具有3、7个参数的构造函数和复制构造函数(具有1个参数)。因此,它测试了所有这3个候选者,但找不到匹配的候选者,因为您调用的构造函数没有参数(提供了0个参数)。

在代码中搜索并找到调用默认构造函数的位置。

如果您有CyclicalBuffer成员,但没有在类的构造函数中初始化它,则调用默认构造函数,这是不可能的,因为CyclicalBuffer没有它。示例:

struct Data
{
    Data(int, int) {}
    int x, y;
};
struct MyClass
{
    MyClass() {} // error C2512: 'Data' : no appropriate default constructor available
    Data data;
};
struct MyClass2
{
    MyClass(): 
        data(41, 13) // OK
    {} 
    Data data;
};

若我理解正确的话,类已经有了cyclicalbuffer_成员,它是在构造函数初始值设定项列表中初始化的。但是您又添加了一个这样的成员,并且没有初始化它。