7
votes

Comment retourner un FRStream (C ++ 0x)

Je pense que je vais y aller et commencer avec le code:

int main()
{
    auto os = test("testfile");
    os << "Test1\n";
    auto os2 = std::move(os);
    os2 << "Test2\n";
}


0 commentaires

3 Réponses :


2
votes

Le problème est avec ceci:

test(test&& old) : std::ofstream(std::move(old)) {};


5 commentaires

Votre réponse donne l'erreur de compilation suivante sur GCC 4.5: "'std :: ios_base :: ios_base (const std STD :: ios_base &)' est privé". Êtes-vous sûr d'avoir ceci pour compiler et si oui, sur quel compilateur?


@Clinton: Je n'ai pas essayé de compiler votre code, bien que j'ai fait cela plusieurs fois auparavant. (Remarque "Il compile" n'est pas nécessairement testé pour qu'il soit correct C ++). Vous devez modifier votre question pour inclure le nouveau code que vous essayez et toutes les erreurs.


Êtes-vous sûr d'un constructeur de rvalue?


@Clinton: Yup, en C ++ 0x. Assurez-vous que vous compilez avec cela activé.


En C ++ 0X, vous devriez être capable de retourner ou de déplacer l'Ofstream directement, sans avoir besoin de l'envelopper dans votre test. Bien que avec le constructeur de déplacement de test corrigé, l'emballage est également correct.



0
votes

Est-ce que l'appelant doit savoir que vous retournez un destream ou aurait-il plus de sens de renvoyer un streambuf et laissez l'appelant en envelopper dans un flux ?


0 commentaires

16
votes

Je vais répondre à ma propre question ici:

dans le Caractéristiques de la bibliothèque GCC C ++ 0x Page, ont Un regard sur le point 27.9, qui lit:

27.9 - Streams à base de fichiers - partielle - Déplacement manquant et opérations d'échange

Je suppose que c'est probablement la question que j'ai avec GCC.


3 commentaires

Oui, ça le ferait. Bonne trouvaille, cependant.


Toujours vrai maintenant?


Ne ressemble pas à ça non. N'hésitez pas à éditer la question et répondre si vous le pouvez.