有人给了我以下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(),它可以执行各种自定义操作。
答案 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
继承自ostream
,typedef
专门针对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
是抽象的。
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 ) { ... }