2013-05-04 4 views
-1
#include <memory> 
#include <istream> 

typedef std::unique_ptr<std::istream> myType; 

class myClass{ 

    myType myStream; 
public: 

    myClass(myType a_stream){ 
     myStream = std::move(a_stream); //compiler error 
    } 

}; 

Pourquoi je ne suis pas autorisé à déplacer un flux nouvellement créé? Pour autant que je sache, les flux ne sont pas copiables, mais sont mobiles. Est-ce que je manque quelque chose? Pointeur unique s'adapte particulièrement bien pour les objets non-copiables, au moins théoriquement.Pointeur unique vers le flux

erreur du compilateur

no match for 'operator=' 
+0

Quel est votre compilateur? Avez-vous '# include'd tous les fichiers d'en-tête nécessaires? –

+0

GCC 4.8.x et oui bien sûr istream et la mémoire sont inclus. Je modifie le message – GameDeveloper

+0

Eh bien, [je ne peux pas reproduire cela] (http://ideone.com/QX4PKk) ... –

Répondre

1

L'argument du constructeur est par valeur - vous devez faire par référence. Avec par valeur l'objet doit être copié lorsque vous utilisez le constructeur. Ok, vous utilisez unique_ptr, mais il est toujours copié là où il ne peut être déplacé.

Alors, essayez comme ceci:

myClass(myType &a_stream){ 
    myStream = std::move(a_stream); //compiler error 
} 

ou peut-être même

myClass(myType &&a_stream){ 
    myStream = std::move(a_stream); //compiler error 
} 

c'est par référence alors et aucune copie à l'endroit où l'aide se produira.

Bien que, je trouve étrange que vous obteniez l'erreur à l'endroit de move, donc je peux me tromper.

+0

ouais fondamentalement l'erreur était une faute de frappe, mais vous savez que la sortie de GCC est difficile à comprendre quand vous obtenez des erreurs ^^. De toute façon ta réponse est bonne. En fait, j'utilise des constructeurs de mouvement tout le long. :) – GameDeveloper

1

Votre code compile pour moi. Je ne vois rien de mal à cela.