【问题标题】:c2512 error: no appropriate default constructor availablec2512 错误:没有合适的默认构造函数可用
【发布时间】:2012-10-10 23:02:09
【问题描述】:

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

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

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

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

然后我将这个“first.h”包含在我的“second.h”中,然后将这个“second.h”包含在我的“third.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”中,我得到一个错误提示

声明不兼容

如何解决?

【问题讨论】:

  • tmpM 不是构造函数..构造函数与类名同名..

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


【解决方案1】:

这里的问题似乎是您将类命名为不同于您为构造函数命名的名称。它们必须具有相同的名称。另外,我假设您希望对您传入的模型的引用由对象持有。如果您想将其保留为引用,则必须在构造函数初始化列表中对其进行初始化。

你想要:

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

【讨论】:

    【解决方案2】:

    应该是:

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

    您的版本声明了一个名为 tmpM 的函数(好吧,尝试这样做,因为它的语法无效 - 缺少返回类型),它不会初始化成员。

    你必须像上面那样做,因为该类型的成员没有默认构造函数,所以你必须在构造函数的初始化列表中对其进行初始化。

    【讨论】:

      【解决方案3】:

      默认构造函数是

      class myClass {
      public:
        myClass();
      }
      

      【讨论】:

      • 但他必须知道这是什么
      猜你喜欢
      • 2016-03-28
      • 2013-08-25
      • 2014-12-31
      • 2012-12-16
      • 2014-01-31
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多