J'ai l'exemple de classe suivant, simplifié d'un projet plus grand. Il est basé sur un cadre de journalisation qui utilise la portée de l'enregistreur pour terminer une entrée de journal dans le destructeur.Pourquoi un objet contenant un membre ostringstream ne peut-il pas être construit?
Le code ci-dessous ne compilera pas car le constructeur est une fonction supprimé implicitement (edit: pas vrai), qui semble avoir quelque chose à voir avec l'objet std::ostringstream
. Je suis confus à ce sujet parce que je pense que je devrais être capable de construire directement un std::ostringstream
, ce qui signifierait que je devrais être capable de construire directement un objet Container
.
#include <iostream>
#include <sstream>
class Container {
public:
std::ostringstream bufferStream;
public:
Container(); // constructor
~Container();
};
Container::Container() {
bufferStream << "Hello ";
}
Container::~Container() {
std::cout << bufferStream.str() << " [end]" << std::endl;
}
// === Main method ===
int main() {
Container().bufferStream << "world"; // works fine
{ // causes tons of compiler errors
Container cont = Container();
cont.bufferStream << "world!";
}
return 0;
}
Notez que la ligne «fonctionne bien» fait juste cela. Il semble instancier un objet anonyme Container
, qui contient un nouveau std::ostringstream
, qui peut être directement accédé à la sortie "monde". Le Container
crée lui-même la partie "Bonjour" du message et son destructeur vide le tampon.
Pourquoi la deuxième partie, dans laquelle l'objet Container
est nommé et enregistré, ne fonctionne-t-elle pas correctement? Voici un exemple des erreurs que j'ai:
error.cpp: In function ‘int main()’:
error.cpp:28:36: error: use of deleted function ‘Container::Container(const Container&)’
Container cont = Container();
^
error.cpp:4:7: note: ‘Container::Container(const Container&)’ is implicitly deleted because the default definition would be ill-formed:
class Container {
^
error.cpp:4:7: error: use of deleted function ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’
In file included from error.cpp:2:0:
/usr/include/c++/4.8/sstream:387:11: note: ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’ is implicitly deleted because the default definition would be ill-formed:
class basic_ostringstream : public basic_ostream<_CharT, _Traits>
... et ainsi de suite.
Euh, ce n'est pas dupe de [cette question] (http://stackoverflow.com/q/3442520/2069064). – Barry