2010-06-24 71 views
0

我不能让下面的stringstreamm编译stringstream的问题

stringstream qss; 

qss.operator << "some text " ::stringstream.operator << DDateTime::date2Oracle(dFrom) ::stringstream.operator << " more text " ::stringstream.operator << DDateTime::date2Oracle(dUntil); 

如果我只是用<<运营商没有它抱怨运营商是ambigious,现在抱怨的语法不正确的::stringstream.operator ...

error C2143: syntax error : missing ';' before 'std::stringstream' 

编辑:

错误C2593:“运算< <'含糊不清 c:\ Program Files \ Microsoft Visual Studio .NET 2003 \ Vc7 \ include \ ostream(434):可能是'std :: basic_ostream < _Elem,_Traits> :: _ Myt & std :: basic_ostream < _Elem, _Traits> ::操作< <(STD :: basic_ostream < _Elem,_Traits> :: _ Mysb *)” 与 [ _Elem =字符, _Traits =标准:: char_traits ]

+0

我们需要第二行描述替代方法:) – vava 2010-06-24 13:30:26

+1

我们需要知道DDateTime返回的类型。 – Puppy 2010-06-24 13:31:53

+0

字符串DDateTime :: date2Oracle(DATE日期) – 2010-06-24 13:33:13

回答

2

嗯,很明显,无论何种类型DDateTime::date2Oracle(dFrom)收益没有实现<<运营商。所以你必须自己写一个。

至于语法,首先你要调用它就像一个功能,它实际上是:

stringstream qss; 
operator<<(
    (operator<<(qss << "some text ", 
       DDateTime::date2Oracle(dFrom)) << " more text "), 
     DDateTime::date2Oracle(dUntil)); 

而且所有的第二,stringstreamstd命名空间中定义,所以你必须把它写如std::stringstream::std::stringstream::stringstream将在全局命名空间中查找它,并且在那里没有定义这样的类。

顺便说一句,operator<<通常是免费的功能,所以qss.operator<<将无法​​正常工作。

+0

解释+ 1相同,也可以尝试agsamek提出的建议。 – rubenvb 2010-06-24 13:19:24

+0

date2Oracle()返回一个std :: string – 2010-06-24 13:21:47

+0

@Tony,然后再次检查错误消息。 'stringstream'确实可以和'std :: string'一起使用,并且问题在其他地方。 – vava 2010-06-24 13:25:15

2

您需要调用操作员就像一个功能。

std::stringstream s; 

operator<<(s, "Your string") 
+0

如何连接多个相同的字符串流? – 2010-06-24 13:15:40

+0

多次呼叫。 – 2010-06-24 13:18:43

+0

您可能还需要为您的类型定义适当的运算符重载:'std :: ostream&operator <<(std :: ostream&os,const DDateTime&d){...}' – 2010-06-24 13:19:51

1

演员到/结构字符串明确:

qss << "some text " << string(DDateTime::date2Oracle(dFrom)) 
    << " more text " << string(DDateTime::date2Oracle(dUntil)); 
+0

不,这是错误的方法。必须存在'operator <<'的重载,它接受与'date2Oracle'函数的返回类型兼容的类型作为第二个参数。 – Philipp 2010-06-24 13:19:24

+0

否 - 需要转换为字符串,这很可能存在。如果您的答案已经降低了,请考虑提高回报率。 – agsamek 2010-06-24 13:25:43

+2

我没有downvoted。但是在C++中,通过实现'operator <<'*来执行字符串*的转换,然后应用stringstream或'boost :: lexical_cast',而不是相反!另外,'string(...)'是一种旧式的转换,应该在C++中避免。 – Philipp 2010-06-24 13:29:18

0

是什么阻止你做:

stringstream s; 
s << "some text" << (DDateTime::date2Oracle(dFrom)) << "more text" << (DDateTime::date2Oracle(dUntil)) ; 
+0

由于编译器错误,我说在我的问题... – 2010-06-24 13:16:18

+0

为什么这是downvoted?这是正确的语法。如果这不起作用,那么调用'date2Oracle'函数是不明确的,问题实际上与stringstreams或operator <<'无关。 – Philipp 2010-06-24 13:18:10

+0

@Tony最重要的部分是我在括号中加入了'DDateTime :: date2Oracle'。现在它不能被'::'运算符混淆。 – wheaties 2010-06-24 13:19:56

2

围棋很大胆:

qss.operator <<("some text "); 
qss.operator <<(DDateTime::date2Oracle(dFrom)); 
qss.operator <<(" more text "); 
qss.operator <<(DDateTime::date2Oracle(dUntil)); 

而且你可能会在含糊之处得到一个更好的想法。

+0

将产生与qss <<“text”<< Somefunc()<<“more text”相同的效果; ??? – 2010-06-24 13:18:41

+0

运算符<<应该返回该流,以便它可以被下一个运算符<<使用。这就是所谓的链接,应该与功能符号 – stefaanv 2010-06-24 13:40:41

3

operator关键字不属于这里,让他们出来:

qss << "some text" << DDateTime::date2Oracle(dFrom) << " more text " << DDateTime::date2Oracle(dUntil); 

这应该是完全有效的和明确的,除非date2Oracle功能含糊过载。

为一类T实施operator<<正确的模式是:

template<typename Char, typename Traits> 
std::basic_ostream<Char, Traits> 
operator<<(std::basic_ostream<Char, Traits>& stream, const T& object) { 
    // now put something into the stream 
    return stream; // return stream << xyz ... is also possible 
} 
1

应该用qss << "some text " << DDateTime...不够?