【问题标题】:"no appropriate default constructor available" for C++ derived classC++ 派生类的“没有适当的默认构造函数可用”
【发布时间】:2012-11-24 02:09:25
【问题描述】:

我对 C++ 类定义感到困惑。有人可以帮帮我吗?

我有这样定义的原始模板类:

template <typename T> 
struct SYNCHED_DATA{
    SYNCHED_DATA(int r)
    {
        var_R = r;
    }

    void set(T* pV)
    {
        var_T = *pV;
    }

    //...

private:
    //Copy constructor and assignments are NOT available!
    SYNCHED_DATA(const SYNCHED_DATA& s)
    {
    }
    SYNCHED_DATA& operator = (const SYNCHED_DATA& s)
    {
    }

    T var_T;
    int var_R;
};

然后我从另一个类中使用它:

struct THREADS_REPORT{
    THREADS_REPORT()     //error C2512: 'SYNCHED_DATA<T>' : no appropriate default constructor available
    {
    }

    void getReport(THREADS_REPORT_DATA* pOutReport)
    {
        //Retrieve report array
        sthrd.get(pOutReport);
    }
    void setReport(THREADS_REPORT_DATA* pReport)
    {
        //Set report array
        sthrd.set(pReport);
    }

private:
    SYNCHED_DATA<THREADS_REPORT_DATA> sthrd;

    //Copy constructor and assignments are NOT available!
    THREADS_REPORT(const THREADS_REPORT& s)   //error C2512: 'SYNCHED_DATA<T>' : no appropriate default constructor available
    {
    }
    THREADS_REPORT& operator = (const THREADS_REPORT& s)
    {
    }
};

但我在第二类中至少有两个位置出现“错误 C2512”错误(在上面的代码中标记。)我需要如何更改第二类才能使其编译?

【问题讨论】:

  • 这就是它所说的意思。你已经告诉它调用SYNCHED_DATA&lt;THREADS_REPORT_DATA&gt; 的默认构造函数,但它没有。

标签: c++ class templates struct


【解决方案1】:

您应该尝试通过成员初始化列表在THREADS_REPORT 构造函数中初始化THREADS_REPORT::sthrd

 THREADS_REPORT(int i) : sthrd(i)
 {
 }

或为SYNCHED_DATA 提供默认构造函数:

SYNCHED_DATA() {}

【讨论】:

  • 好的,知道了。谢谢。这是由于睡眠不足造成的……错过了构造函数。
  • 一般的经验法则是显式定义默认构造函数、复制构造函数和赋值运算符,如果您需要定义其中任何一个。那么你就不用猜测会自动发出哪个构造函数了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 2018-11-30
  • 1970-01-01
  • 2016-04-22
  • 2013-10-14
相关资源
最近更新 更多