Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么会出现这种错误&引用;没有合适的默认构造函数可用“; 有人给了我下面的C++代码片段,现在我已经失去了与他们的联系(这是一个很长的故事)。无论如何,它不会编译-我得到一个错误_C++ - Fatal编程技术网

为什么会出现这种错误&引用;没有合适的默认构造函数可用“; 有人给了我下面的C++代码片段,现在我已经失去了与他们的联系(这是一个很长的故事)。无论如何,它不会编译-我得到一个错误

为什么会出现这种错误&引用;没有合适的默认构造函数可用“; 有人给了我下面的C++代码片段,现在我已经失去了与他们的联系(这是一个很长的故事)。无论如何,它不会编译-我得到一个错误,c++,C++,错误C2512:“mstream”:没有合适的默认构造函数可用 谁能解释一下原因,以及需要什么来修复它 class mstream : private ostream { public: mstream& operator << (char *value) { printf ("[%s]\n", value); return *this; } mstream& operator << (int value) {

错误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;

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

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

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

有关要传递的参数的详细信息,请参阅。

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

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

    /* Maybe this is more appropriate:

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

    */

    // ...
};

所以它可以构造。你放在那里的内容取决于你想做什么。

mstream
继承自
ostream
,这是一个
typedef
类模板
basic\u ostream
专用于
char
。由于没有为
mstream
定义构造函数,编译器将尝试使用
ostream
的默认构造函数来初始化基类

但是,
basic\u ostream
没有默认构造函数(没有参数),因此您必须为基类构造函数提供带有适当输入的
mstream
构造函数。您可以选择如何构造基类:

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

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

std::ostream
是一个类型定义:

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

这就是
mstream
类的全部定义吗?下次,请使用问题“主题”进行有意义的主题描述。这一条很有趣:“初学者”不重要,对每个人都一样。“问题”:SO上的每个问题都是一个问题。“C++”:已经在标签中提到。@chiccodoro:要点。请参阅新主题。为什么要将
ostream
子类化,然后使用
stdio
?是的,构造函数不需要类型。-1没有帮助。看,这个问题的答案是-9。哼。。。很好的参考:p@Johannes当前位置你和我似乎属于罕见的“授权胜过补丁”群体。我不明白为什么,你会认为我们应该给人们知识来解决他们自己的问题,学习如何获取信息并将其应用到其他地方,全面提高他们在该领域的批判性思维技能,而不是仅仅修补他们的工作,但显然大多数人不同意。这太愚蠢了。@GMan:只有当它看起来像是学校的问题时,我才会暗示。然而,回答问题,而不是教学也是如此。然而,我同意你的观点,给予人们工具比解决他们的问题更好。有时候,回答一个问题会给你工具;显然,我只是在这里暗示。
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;
}
  mstream& operator << (int value)
  {
    std::cout << value << std::endl;
    return *this;
  }
typedef basic_ostream<char, char_traits<char> > ostream;
explicit basic_ostream(basic_streambuf<Elem, Tr> *strbuf);
mstream(): ostream( pointer_to_some_implementation_of_streambuf ) { ... }