2013-07-08 58 views
1

这里是我在程序中的C++构造函数问题。“没有匹配的函数调用”发生在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_未正确构造的问题,为什么它会报告cycleical_上的错误?为了确保错误报告行85是循环线(DISTANCE_THRESHOLD,VOLUME_SIZE,VOLUME_X)

任何人都可以帮我指出它存在的潜在问题吗?

+0

CyclicalBuffer在类的末尾有一个缺失的分号 - 您已将它放在名称空间右花括号上,但我认为这不是问题 – doctorlove

+0

您可以在此处显示的代码中标记第85行吗?它是你在初始化'cyclical_'的行吗?有没有其他的'KinfuTracker'构造函数你没有显示? –

+2

我想你需要向我们展示'KinfuTracker'的全部定义(头部中的部分),因为你向我们展示的代码看起来没有任何问题。 –

回答

2

凑合的东西放在一起,我觉得你这是什么(通过留下了一些命名空间位的简化了):

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_成员。

0

某处在你的代码中调用CyclicalBuffer默认构造函数(不带参数):

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

但类CyclicalBuffer不具备这样的构造。

编译器只能找到具有3,7个参数和copy-constructor(带有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_成员,这是在构造函数初始化列表初始化。但是你又增加了一个这样的成员,并没有初始化它。

2

就像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); 
+0

cyclical_有3个参数构造函数。在开始时,它没有被初始化,并且它也有一个具有3个参数的右类型初始化器。对不起,我不明白你的观点。 –

+0

是的,它可能在你的'pcl :: gpu :: kinfuLS :: KinfuTracker :: KinfuTracker'函数中有三个参数,但是当你声明'cyclical_'时,你没有给出任何导致尝试调用'CyclicalBuffer() '(零参数构造函数),它不存在。 –

+0

但是为什么它会在pcl :: gpu :: kinfuLS :: KinfuTracker :: KinfuTracker中发生错误。我在这个问题上添加了一些线索。它会有帮助吗? –