2010-12-15 32 views
3

J'ai un std::vector<std::string> temp_results et je souhaite utiliser std :: for_each passer par ce vecteur et concaténer une chaîne, donc je concoctée la construction suivante:std :: stringstream comme paramètre à une fonction

std::stringstream ss; 
std::string res = std::for_each(temp_results.begin(), temp_results.end(), boost::bind(addup, _1, ss)); 

std::string addup(std::string str, std::stringstream ss) 
{ 
    ss << str; 
    ss << ";"; 

    return ss.str; 
} 

I obtenir l'erreur suivante, qui est au-delà de mon entendement:

error C2475: 'std::basic_stringstream<_Elem,_Traits,_Alloc>::str' : forming a pointer-to-member requires explicit use of the address-of operator ('&') and a qualified name 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits<char>, 
      _Alloc=std::allocator<char> 
     ] 

Quelqu'un pourrait expliquer ce qui ne va pas?

+1

Peut-être qu'il est mieux si vous passez le 'stringstream' par référence. –

Répondre

4

Si, en écrivant return ss.str; vous avez l'intention d'appeler la fonction membre str de std::stringstream, alors il vous manque une paire de parenthèses:

return ss.str(); 

En outre, votre code ne fera probablement pas ce que vous attendez. Si vous voulez que chaque appel à addup fonctionne sur la même instance std::stringstream, vous devez le prendre par référence: modifiez la signature addup et ajoutez un boost::ref() autour du paramètre ss dans le boost::bind.

Voici une version de travail que je suppose-t-ce que vous attendez:

void addup(std::string str, std::stringstream &ss) 
{ 
    ss << str; 
    ss << ";"; 
} 

int main() 
{ 
    std::vector<std::string> temp_results; 
    /* ... */ 

    std::stringstream ss; 
    std::for_each(temp_results.begin(), temp_results.end(), boost::bind(addup, _1, boost::ref(ss))); 
    std::cout << ss.str() << std::endl; 
} 

Une alternative à l'aide boost::lambda:

std::for_each(temp_results.begin(), temp_results.end(), ss << boost::lambda::_1 << ';'); 
+0

est corrigé, mais maintenant il est dit que boost :: bind ne peut pas prendre de stringstream comme param 3, il n'y a pas de surcharge pour bind ??? –

+0

@Tony: voir mon edit – icecrime