是否可以使用cout从用户定义的类型自动转换为std :: string?

时间:2010-10-22 19:39:47

标签: c++ casting stdstring implicit-cast user-defined-types

在问题中,如果我在我的类中定义一个字符串运算符:

class Literal {
  operator string const () {
    return toStr ();
  };

  string toStr () const;
};

然后我用它:

Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;

使用显式转换一切正常,但如果我删除(字符串),编译器说它需要在std :: string中声明的强制转换运算符。它不应该自动投射我的类型? 解决:我正在超载运营商&lt;&lt; (ostream&amp; os,const Literal&amp; l)。

2 个答案:

答案 0 :(得分:10)

No .. std :: string必须有一个以Literal作为参数的构造函数。

你可以做的是重载运算符&lt;&lt;对于你的Literal类,并将它转换并插入到那里的流中。

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}

答案 1 :(得分:5)

简短回答:继续使用强制转换或toStr(),或编写自己的operator<<函数。 (我希望l1.toStr()(string)l1。)

答案很长: 如果标准库具有函数

,这可能有效
std::ostream& operator<<( std::ostream&, std::string const& );

它几乎可以做到,但技术上并非如此。 ostreamstring都是模板实例化的typedef。并且有一个模板功能可以将一个插入另一个。

// This is somewhat simplified.  For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
  typedef basic_string<char> string;
  typedef basic_ostream<char> ostream;

  template <typename CharT>
  basic_ostream<CharT>& operator<<(
    basic_ostream<CharT>&, 
    basic_string<CharT> const&);
}

因此,当您使用cout << str str类型为std::string的{​​{1}}时,可以使用CharT = char来确定使用该模板函数。

但是C ++不允许你让编译器同时找出隐式类型转换(Literalstring)并推导模板函数模板参数(CharT = char)调用