我有一个像这样的类构造函数:
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。
有人知道我在哪里错了吗?为什么这段代码不能编译?如果我缺乏信息,我会提前道歉。我会为那些要求更多信息的人更新我的问题。
答案 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") );