为什么这个错误? “没有合适的默认构造函数”

时间:2010-10-22 13:10:50

标签: c++

有人给了我以下C ++代码片段试用 - 现在我已经失去了与他们的联系(这是一个很长的故事)。无论如何,它不会编译 - 我收到错误

  

错误C2512:'mstream':没有合适的默认构造函数

任何人都可以解释为什么以及需要解决的问题。

class mstream : private ostream
{
  public:

  mstream& operator << (char *value)
  {
    printf ("[%s]\n", value);
    return *this;
  }
  mstream& operator << (int value)
  {
    printf ("[%u]\n", value);
    return *this;
  }

};
mstream g_mcout;

编辑:哎呀,错过了这个...

ostream& mcout ()
{
  return g_mcout;
}
ostream& SgDebug ()
{
  return g_mcout;
}

FYI:这个奇怪的代码的原因与将C ++与C程序合并有关。 printf()实际上将被更改为my_printf(),它可以执行各种自定义操作。

5 个答案:

答案 0 :(得分:6)

ostream没有默认构造函数; mstream隐式创建的默认构造函数因此而无效。您需要为ostream提供流缓冲区:

class mstream : private ostream
{
public:
    mstream() :
    ostream(/* whatever you want */)
    {}

    /* Maybe this is more appropriate:

    mstream(std::streambuf* pBuffer) :
    ostream(pBuffer)
    {}

    */

    // ...
};

所以它可以构建。你放在那里取决于你想要做什么。

答案 1 :(得分:3)

mstream继承自ostreamtypedef专门针对basic_ostream的课程模板char。由于您没有为mstream定义构造函数,因此编译器将尝试使用ostream的默认构造函数来初始化基类。

但是,basic_ostream没有默认构造函数(没有参数),因此必须为基类构造函数提供合适输入的mstream构造函数。您对如何构造基类的选择是:

explicit basic_ostream(
    basic_streambuf<_Elem, _Tr> *_Strbuf,
    bool _Isstd = false
);
basic_ostream(
    basic_ostream&& _Right
);

第一个是你最明智的选择,例如:

class mstreambuffer : public streambuf
{
public:
    mstreambuffer() : streambuf()
    {
    }
};

class mstream : private ostream
{
public:
    mstream(mstreambuffer* buff) : ostream(buff) {}
};

int main(void)
{
    mstreambuffer buff;
    mstream g_mcout(&buff);
    g_mcout << 32768;
    return 0;
}

mstreambuffer是必要的,因为streambuf是抽象的。

除了不可编译之外,这段代码还使用CRT(printf)代替通过cout的更常见的C ++输出,因此它更加令人怀疑。喜欢这个:

  mstream& operator << (int value)
  {
    std::cout << value << std::endl;
    return *this;
  }

答案 2 :(得分:1)

您需要添加默认构造函数,因为您正在尝试创建实例。

class mstream : private ostream
{
    public:
    mstream()
    {
    }
    ...
}

有关要传递的参数的详细信息,请参阅http://www.cplusplus.com/reference/iostream/ostream/ostream/

答案 3 :(得分:1)

您的父类(ostream)没有默认构造函数,因此您的mstream类的构造函数也必须手动构造ostream父级。

答案 4 :(得分:0)

std::ostream是一个typedef:

typedef basic_ostream<char, char_traits<char> > ostream;

然后std::basic_ostream<>没有默认的contstructor,只有这个:

explicit basic_ostream(basic_streambuf<Elem, Tr> *strbuf);

所以你需要明确地调用基类的构造函数L

mstream(): ostream( pointer_to_some_implementation_of_streambuf ) { ... }