stringstream运算符选择问题

时间:2011-10-18 22:04:57

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

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

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。

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

3 个答案:

答案 0 :(得分:1)

运营商LT;&LT;不返回std :: stringstream,因为它继承自std :: ostream。参见:

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

您可以使用:

DotDashLogMatcher; s

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

也许你想改变:

DotDashLogMatcher( std::stringstream const& pattern );

分为:

DotDashLogMatcher( std::ostream const& pattern );

问题是operator <<为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") );