【问题标题】:stringstream operator selection issuesstringstream 运算符选择问题
【发布时间】:2011-12-10 11:42:43
【问题描述】:

我有一个像这样的类构造函数:

DotDashLogMatcher( std::stringstream const& pattern );

我这样称呼它:

std::stringstream s;
DotDashLogMatcher( s << "test" );

这是一个过于简单的例子,但本质上就是这样。这是我得到的确切编译器错误。请注意,由于某种原因,传入的结果对象是 basic_ostream,我不确定这是否正常。它无法像我的函数所期望的那样将其转换为 std::stringstream。

error C2664: 'DotDashLogMatcher::DotDashLogMatcher(const stlpd_std::stringstream &)' : cannot convert parameter 1 from 'stlpd_std::basic_ostream<_CharT,_Traits>' to 'const stlpd_std::stringstream &'
        with
        [
            _CharT=char,
            _Traits=stlpd_std::char_traits<char>
        ]
        Reason: cannot convert from 'stlpd_std::basic_ostream<_CharT,_Traits>' to 'const stlpd_std::stringstream'
        with
        [
            _CharT=char,
            _Traits=stlpd_std::char_traits<char>
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous

我在 Windows 上使用 VS2003 和 STLport。

有人知道我哪里出错了吗?为什么这段代码不能编译?如果我缺乏信息,我会提前道歉。我会为那些要求更多信息的人更新我的问题。

【问题讨论】:

    标签: c++ stl compiler-errors stringstream stlport


    【解决方案1】:

    operator

    http://www.cplusplus.com/reference/iostream/stringstream/

    你可以使用:

    DotDashLogMatcher(s);

    或者您可以更改方法声明以匹配返回类型。

    【讨论】:

    • 如果没有相应的流式操作符,那么拥有 stringstream 有什么意义?我很惊讶 stringstream 没有重载
    • @Robert :动态多态性的关键在于您不应该关心流的类型。为什么你的界面特别需要stringstream
    • @ildjarn 调用 str() ,当然是为了得到一个 std::string 。我不想在函数之外以某种迟钝的方式调用 str()。
    • std::stringstream 继承了流式操作符,所以可以正常使用。优点是操作员代码不重复。缺点是您不能将这些运算符的结果用作 std::stringstream。你可以转换它: DotDashLogMatcher( static_cast<:stringstream const>(s
    【解决方案2】:

    我认为您应该将语句拆分为两个单独的命令:

    s << "test";
    DotDashLogMatcher( s );
    

    因为参数是通过引用传递的,因此需要修改,因此是左值。

    【讨论】:

    • 分离语句有效,但不是因为您认为它有效。
    【解决方案3】:

    也许你想改变:

    DotDashLogMatcher( std::stringstream const& pattern );
    

    进入:

    DotDashLogMatcher( std::ostream const& pattern );
    

    问题是operator &lt;&lt; 为 std::ostream 重载并返回std::ostream

    如果你不能改变它,有几种解决方法。

    std::stringstream s;
    s << "test"
    DotDashLogMatcher( s );
    
    // slightly more dangerious but should work.
    std::stringstream s;
    DotDashLogMatcher( static_cast<std::stringstream const&>(s << "test") );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2010-12-24
      • 2020-10-24
      相关资源
      最近更新 更多