c2512错误:没有适当的默认构造函数可用

时间:2012-10-20 14:22:47

标签: c++ error-handling constructor compiler-errors

即使我声明了构造函数,我也遇到了“c2512”错误。我的代码是这样的:在我的“first.h”文件中,我宣称它是:

class myClass
{
public:
    tmpM ( cv::Mat& _model );
}

然后在我的“first.cpp”中我做了:

#include "first.h"
myClass::tmpM ( cv::Mat& _model )
{
    ...
}

然后我在“second.h”中包含了这个“first.h”,然后在我的“third.h”中包含了这个“second.h”,并在我的“third.cpp”中调用了这个类,如下所示:

cv::Mat myMat ( height, width, CV_8UC3 );
tmpM aM ( myMat );

但这会发出c2512错误,说

  
    

没有合适的默认构造函数

  

我确实搜索了这个,发现我应该自己构建一个默认的构造函数,我试着在我的“first.h”中这样做:

class myClass
{
public:
    tmpM ( cv::Mat& _model) {};
}

然后得到一个错误说:

  
    

函数“myClass :: tmpM”已经有一个正文

  

我尝试了其他几种方法,但仍然无法解决。我认为我不需要在这里构建一个默认构造函数,但仍然对此感到困扰。有人能帮助我吗?

修改

好的,在您提出建议后,我将其更改为以下格式:

class myClass
{
public:
myClass(cv::Mat& _model ) : tmpM (_model)
{
}
private:
cv::Mat& tmpM;
};

然后在我的“first.cpp”中,我收到了一个错误

  
    

声明不兼容

  

怎么能解决这个问题?

3 个答案:

答案 0 :(得分:4)

这里的问题似乎是你已经将你的类命名为你命名构造函数之外的东西。它们必须具有相同的名称。另外,我假设您希望对象所持有的模型的引用。如果要将其保留为引用,则必须在构造函数初始化列表中初始化它。

你想:

class myClass
{
public:
    myClass(cv::Mat& _model ) : tmpM (_model)
    {
    }
private:
    cv::Mat& tmpM;
};

答案 1 :(得分:3)

应该是:

class myClass
{
public:
    myClass(cv::Mat& _model ) : tmpM (_model)
    {
    }
};

你的版本声明了一个函数(好吧,试图,因为它是无效的语法 - 缺少返回类型),称为tmpM,它不会初始化成员。

您必须按上述方式执行此操作,因为该类型成员的成员没有默认构造函数,因此您必须在构造函数的初始化列表中初始化它。

答案 2 :(得分:0)

默认构造函数是

class myClass {
public:
  myClass();
}