1

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

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。

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

4

3 回答 3

1

operator<< 不返回 std::stringstream,因为它继承自 std::ostream。看:

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

您可以使用:

DotDashLogMatcher(s);

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

于 2011-10-18T22:43:32.507 回答
0

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

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

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

于 2011-10-18T22:31:33.057 回答
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") );
于 2011-10-18T23:38:59.653 回答