2010-09-21 4 views
4

Avec une bataille désespérée avec Boost.Asio, j'ai rencontré beaucoup de difficultés.Comment localiser les erreurs "boost :: non-oculable"?

L'un d'entre eux est que je peux difficilement localiser où les "boost :: erreurs non-jetables" sont !!

Si je viole accidentellement la réglementation non-occlusable, IDE me montre seulement quelques erreurs dans noncopyable.hpp ou ailleurs, mais nulle part dans mes fichiers.

Je peux seulement trouver des erreurs par le commentaire & décommenter partout asio objet existe.

(ps: mon IDE est visual C++ 2008, est-ce IDE a une mauvaise relation avec Boost ??)

EDIT:

Je sais que la lecture du message d'erreur tout aide beaucoup. Mais qu'en est-il de ça?

1>d:\boost\include\boost-1_42\boost\asio\basic_io_object.hpp(92) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' 
1>  d:\boost\include\boost-1_42\boost\noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' 
1>  d:\boost\include\boost-1_42\boost\noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' 
1>  This diagnostic occurred in the compiler generated function 'boost::asio::basic_io_object<IoObjectService>::basic_io_object(const boost::asio::basic_io_object<IoObjectService> &)' 
1>  with 
1>  [ IoObjectService=boost::asio::stream_socket_service<boost::asio::ip::tcp> ] 

Tout est causé par ce

tcp::socket getSocket(){ 
     return m_socket; 
    } 

(il devrait être:

tcp::socket& getSocket(){ 
     return m_socket; 
    } 

)

Quand il y a beaucoup fonctions dans ce fichier, pouvez-vous les gars le trouver rapidement?

(ps2: peut-être tous ces troubles sont causés par mon pooooooor C++ expérience de programmation ??)

+0

La lecture de l'ensemble du message d'erreur aide généralement là ... lire la réponse de James McNellis.Les compilateurs fournissent généralement beaucoup plus de rapports d'erreurs que nous aimons lire, et ce faisant, plusieurs fois ils peuvent masquer l'erreur réelle ... mais c'est une chose différente. –

+0

J'ai admis à poser la question trop abstrait ... et édité. – rhapsodyn

Répondre

3

Il semble VC++ tout simplement pas vous dire où la tentative d'utiliser le constructeur de copie est.

Par exemple, G ++ fait:

#include <boost/asio.hpp> 
using boost::asio::ip::tcp; 

class X 
{ 
    tcp::socket s; 
public: 
    tcp::socket get() { return s; } 
}; 

Résultats dans:

blah blah blah noncopyable blah blah 
... 
untitled1.cpp: In member function 'boost::asio::blah blah X::get()': 
untitled1.cpp:8: note: synthesized method 'boost::asio::blah(const boost::asio::blah&)' first required here 

À quelques reprises, je viens réussi à compiler la source avec GCC pour comprendre les messages d'erreur de VC++ (et inverse).

Peut-être aussi n'écrivez pas beaucoup de code non-travail sans essayer de le compiler occasionnellement.

+0

Il n'est pas clair pour moi que le compilateur ne dit pas à OP où la référence au constructeur de copie se produit. Il note lui-même qu'il a trouvé la ligne de code - «tout est dû à cela» - et il me semble probable que c'est la ligne de fichier d'en-tête référencée en haut du message d'erreur. –

+0

Je ne pense pas que boost soit buggé. Il y a trois choses: 1) error (boost :: noncopyable n'est pas copiable), 2) ce qui a provoqué l'erreur (générant automatiquement le constructeur de copie pour une classe non oculaire, 3) quelle ligne dans le code de l'utilisateur requiert le constructeur de copie. Le message ne contient pas le 3ème élément. Je suppose que OP a trouvé le coupable en étudiant le code très dur. VC++ ne pointe pas vers l'endroit actuel où le constructeur de copie est appelé. – UncleBens

1

J'ai récemment lutté contre un problème similaire, où l'élément non-copiable faisait partie d'une classe que j'avais l'intention de renvoyer par référence. J'ai repéré cela en rendant les constructeurs de copie privés pour deux classes suspectes, et j'ai trouvé le problème de cette façon.

Pas beaucoup d'aide si vous renvoyez l'instance de classe boost non-copyable.

Questions connexes