2010-06-24 6 views
0

Je ne peux pas obtenir le stringstreamm suivante pour compilerquestion stringstream

stringstream qss; 

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

Si je viens d'utiliser l'opérateur << sans ::stringstream.operator il se plaint de l'opérateur étant mal assurés, maintenant, il se plaint de syntaxe incorrecte ...

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

EDIT:

erreur C2593: « opérateur < < 'est ambigu c: \ Program Files \ Microsoft Visual Studio .NET 2003 \ Vc7 \ include \ ostream (434): pourrait être' std :: basic_ostream < _Elem, _Traits> :: _ Myt & std :: basic_ostream < _Elem, _Traits> :: operator < < (std :: basic_ostream < _Elem, _Traits> :: _ mySb *) » avec [ _Elem = char, _Traits = std :: char_traits ]

+0

Nous avons besoin de la deuxième ligne où l'alternative est décrite :) – vava

+1

Nous devons connaître le type que DDateTime retourne. – Puppy

+0

string DDateTime :: date2Oracle (DATE Date) –

Répondre

2

Eh bien, il est évident que quel que soit le rendement de type DDateTime::date2Oracle(dFrom) ne met pas en oeuvre l'opérateur <<. Vous devrez donc en écrire un vous-même.

En ce qui concerne la syntaxe, tout d'abord vous devez l'appeler comme une fonction qu'il est en réalité:

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

Et deuxièmement, stringstream défini dans std espace de noms, donc vous devez écrire comme std::stringstream ou ::std::stringstream. ::stringstream le recherchera dans l'espace de noms global et il n'y a aucune telle classe définie là.

BTW, operator<< est généralement implémenté en tant que fonction libre, donc qss.operator<< ne fonctionnerait pas.

+0

explication + 1, essayez aussi ce que agsamek suggéré. – rubenvb

+0

date2Oracle() renvoie une chaîne std :: string –

+0

@Tony, puis vérifie à nouveau le message d'erreur. 'stringstream' fonctionne avec' std :: string' out of the box et le problème est ailleurs. – vava

2

Vous devez appeler l'opérateur comme une fonction.

std::stringstream s; 

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

Comment puis-je concaténer plus d'un à la même strings ??? –

+0

Appelez-le plusieurs fois. –

+0

Vous devrez peut-être également définir une surcharge d'opérateur appropriée pour votre type: 'std :: ostream & operator << (std :: ostream & os, const DDateTime & d) {...}' –

1

Moulage à/chaîne de construction explicitement:

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

Non, c'est la mauvaise façon. Il doit exister une surcharge de 'operator <<' qui prend un type compatible avec le type de retour de la fonction 'date2Oracle' comme deuxième argument. – Philipp

+0

Non - il doit y avoir une conversion en chaîne, qui existe probablement. Si vous avez downvoted ma réponse - s'il vous plaît envisager upvoting à la place. – agsamek

+2

Je n'ai pas déprimé. Mais en C++, vous faites des conversions en string * en implémentant 'operator <<' * puis en appliquant un stringstream ou 'boost :: lexical_cast', pas l'inverse! Aussi, 'string (...)' est un cast de style ancien qui devrait être évité en C++. – Philipp

0

Qu'est-ce qui vous empêche de le faire:

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

En raison d'une erreur de compilation, j'ai dit que dans ma question ... –

+0

Pourquoi est-ce downvoted? C'est la syntaxe correcte. Si cela ne fonctionne pas, l'appel de la fonction 'date2Oracle' est ambigu et la question n'est en fait pas liée aux chaînes ou' operator << '. – Philipp

+0

@Tony la partie importante est que j'ai joint le 'DDateTime :: date2Oracle' entre parenthèses. Maintenant, il ne peut pas être confondu avec l'opérateur '::'. – wheaties

2

Go est vraiment géniale:

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

et vous aurez probablement avoir une meilleure idée de l'ambiguïté.

+0

cela produira le même effet que faire qss << "text" << Somefunc() << "plus de texte"; ??? –

+0

L'opérateur << doit retourner le flux afin qu'il puisse être utilisé par l'opérateur suivant <<. Ceci est appelé chaînage et devrait être le même que la notation de la fonction – stefaanv

3

Les operator mots clés ne font pas ici, les laisser:

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

Cela devrait être tout à fait valable et sans ambiguïté, à moins que la fonction date2Oracle est surchargé ambigüe.

Le bon modèle pour la mise en œuvre operator<< pour un type T est:

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

Ne devrait pas suffire avec qss << "some text " << DDateTime...?

Questions connexes