【问题标题】:How to initialize custom analogue for std::cout?如何为 std::cout 初始化自定义模拟?
【发布时间】:2022-11-17 06:57:37
【问题描述】:

我正在尝试实现我自己的basic_string,但在打印我的字符串时遇到了问题。我不会使用 std::char_traits 和 std 的其他特征,因为我已经自己实现了。如何创建可用于我的字符串的 std::cout 的直接模拟并为此使用 std::basic_ostream? (不会自己创建basic_ostream)。

我尝试了一些解决问题的方法。

例如,下面的代码:

using Ostream = std::basic_ostream<char, CharTraits<char, int> >;
Ostream Cout;

由于这个原因不编译:

std::basic_ostream<char,CharTraits<char,int>>':没有合适的默认构造函数可用

我需要了解初始化我的 cout 版本的最合适方法是什么。

【问题讨论】:

  • 不能为std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const YourOwnStringType&lt;CharT, CharTraits&lt;CharT, N&gt;&gt;&amp;) 创建重载吗?
  • en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream 因为它实际上并没有……等等……有一个默认的构造函数!
  • @TedLyngmo 不,由于std::ostream = basic_ostream&lt;char, char_traits&lt;char&gt;&gt;; 的原因,这不起作用,但我需要完全使用我创建的 CharTraits。
  • @CapyMaths 我根本不明白这个原因。您想创建自己的basic_string 并能够将其流式传输到ostreams,对吗?如果是这样,添加我建议的重载是通常的做法。 ... 或者也将 N 添加到字符串类型中。 example

标签: c++ cout stdstring char-traits


【解决方案1】:

如何创建可用于我的字符串的 std::cout 的直接模拟并为此使用 std::basic_ostream

您根本不需要创建自定义 ostream。您实际上需要做的是为标准 ostream 重载 operator&lt;&lt;,例如:

std::ostream& operator<<(std::ostream &out, const MyString &str)
{
    // print the contents of str to out as needed...
    return out;
}

例如,以下代码: ... 由于这个原因无法编译:

那是因为您正在尝试创建 std::basic_ostream 的默认构造实例,它没有默认构造函数。这与您的自定义字符串类无关。

【讨论】:

  • 但这是行不通的。我需要使用我的CharTraits,无论如何都不能依赖于 stl std::char_traitsstd::ostream 只能用于字符串,其特征正好是std::char_traits。但这根本不适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
相关资源
最近更新 更多