2011-08-13 5 views
1

Possible Duplicates:
Why copying stringstream is not allowed?
how copy from one stringstream object to another in C++?problème avec ostringstream et constructeur de copie

T Compiler classe échoue avec Visual C++ et GCC d'erreurs modèle de iostreams. Voici le code:

#include <sstream> 

class T 
{ 
    static T copy; 

    std::ostringstream log; 

    T()   {} 
    T(const T& t) {log = t.log;} 
    ~T()   {copy = *this;} 
}; 

T T::copy; 

Changer journal type de membre de données à la chaîne fait compiler et exécuter OK. Est-ce un comportement légitime?

Répondre

3

constructeur par copie et copie la cession d'une classe de flux en C++ a été fait private. Cela signifie, vous ne pouvez pas faire une copie de std::ostringstream objet:

std::ostringstream ss; 

std::ostringstream ss1(ss); //not allowed - copy-constructor is private 
ss1=ss; //not allowed - copy-assignment is private 
+0

OK, c'est vrai, mais je me fais la même erreur, même avec copie constructeur vide: 'T (const T & t) {}' –

+0

@ Paul: Publier le code réel, et l'erreur. – Nawaz

+0

@Nawasz: Le code est comme dans ma question ci-dessus avec le constructeur de copie remplacé par: 'T (const T & t) {}' ou 'T (const T & t) {log << t.log.str();}' ou 'T (const T & t) {log << t.log.rdbuf();}'. Je reçois toujours: _'std :: basic_ios <_Elem, _Traits> :: operator = ': aucun chemin accessible à un membre privé déclaré dans la base virtuelle' std :: basic_ios <_Elem, _Traits> '_ –

1

Je pense que ostringstream n'a pas d'opérateur d'affectation surchargé (=).

3

std::ostringstream est copiable pas que ce soit la raison pour laquelle vous obtenez l'erreur. Voir this answer pour plus de détails pour savoir comment vous pouvez surmonter ce problème.

T(const T& t) {log << t.log.rdbuf(); } 
+0

Il produit toujours la même erreur: 'std :: basic_ios <_Elem, _Traits> :: operator =': aucun chemin accessible au membre privé déclaré dans la base virtuelle 'std :: basic_ios <_Elem, _Traits>' –