【问题标题】:Understading ostream and how to declare in a class definition了解 ostream 以及如何在类定义中声明
【发布时间】:2017-03-17 19:56:48
【问题描述】:

大家好,最近我开始更好地理解 c++,我发现了不同的问题,其中大多数问题开始变得清晰。我不明白的一件事是编译器在我尝试声明 ostream 或类声明中的每个流时发现的错误。例如

class Test{
  stringbuff buff;
  ostream out (&buff)

; }

编译器返回此错误消息:

expected identifier before ‘&’ token

另一个是当我尝试:

stringstream stream(std::in|std::out);

编译器返回

error: ‘std::ios<char, std::char_traits<char> >::in’ is not a type
   stringstream out(ios::in|ios::out);

问题是为什么我不能在类声明中调用这些“函数”以及方法之王是什么。例如要更清楚地声明如何以与ostream o(方法)相同的方式在此使用相同的方法;

谢谢大家,对不起我的英语。

【问题讨论】:

  • ostream out{ &amp;buff }; 将修复您的错误。我太累了,希望有人会写一个答案来解释原因和其他解决方案。
  • 发布导致问题的真实代码,并用分号完成。

标签: c++ class methods ostream


【解决方案1】:

您的问题是语句ostream out (&amp;buff) ; 被编译器视为尝试声明函数成员,而不是数据成员;这是Most vexing parse 的一般化案例。

“使用 C++11 中引入的新统一初始化语法解决了这个问题”也用于类内初始化:ostream out{ &amp;buff };

更具体地说,c++11 只允许您将 direct-initialization{}copy-initialization= 一起使用,而不是 @ 987654326@ 在其任何“直接初始化”用法中用于数据成员的类内初始化。

另一个选项是在构造函数的初始化列表中初始化您的数据成员。

class Test
{
  std::stringbuf buff ;
  std::ostream out ;
  public :
    Test () : out( & buff ) { }
} ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2019-08-02
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多