Je sais que cela peut ne pas être aussi utile que tu voulais, mais j'ai trouvé le meilleur outil contre le modèle de messages d'erreur est la connaissance.
Une bonne compréhension de la STL et comment l'utiliser, il vous permettra d'éviter beaucoup d'erreurs dans la première place. Deuxièmement, souvent des messages d'erreur des fonctions dans la STL source - si vous avez une idée comment le TSL est mis en œuvre, cela peut être extrêmement utile à déchiffrer ce que le message d'erreur est sur. Enfin, le compilateur décideurs sont conscients de ce problème et sont progressivement l'amélioration de message d'erreur de sortie, de sorte que vous ferait bien de s'en tenir à la version la plus récente de votre compilateur.
Voici un bon exemple d'une obscure modèle d'erreur:
std::vector<std::unique_ptr<int>> foo;
std::vector<std::unique_ptr<int>> bar = foo;
unique_ptr
n'est pas copiable, elle ne peut être déplacée. Donc, essayez d'affecter un vecteur de unique_ptr à un autre vecteur signifie quelque part dans le vecteur de code source va essayer de copier un pointeur unique. Par conséquent l'erreur proviennent de code qui n'est pas le vôtre et jeter un assez opaque message d'erreur comme un résultat. L'idéal message d'erreur serait
main.cpp(20): ne peut pas construire de 'bar' de 'foo': foo type de modèle est non-copiable
Au lieu de cela, VS2010 donne l'erreur suivante:
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(48): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=int
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1> with
1> [
1> _Ty=int
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(197) : see reference to function template instantiation 'void std::_Construct<std::unique_ptr<_Ty>,const std::unique_ptr<_Ty>&>(_Ty1 *,_Ty2)' being compiled
1> with
1> [
1> _Ty=int,
1> _Ty1=std::unique_ptr<int>,
1> _Ty2=const std::unique_ptr<int> &
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(196) : while compiling class template member function 'void std::allocator<_Ty>::construct(std::unique_ptr<int> *,const _Ty &)'
1> with
1> [
1> _Ty=std::unique_ptr<int>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector(421) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<int>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector(481) : see reference to class template instantiation 'std::_Vector_val<_Ty,_Alloc>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<int>,
1> _Alloc=std::allocator<std::unique_ptr<int>>
1> ]
1> main.cpp(19) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<int>
1> ]
Le tamisage à travers cela, il y a des indices. La première section fait référence à un membre privé de l'accès de l' std::unique_ptr<int>
. La deuxième section, si vous cliquez sur la ligne de source, points au le constructeur de copie d' unique_ptr
, ce qui est déclarée sous un private:
spécificateur. Alors maintenant, nous savons que nous avons essayé de copier un unique_ptr qui n'est pas autorisé. Les Sections 3, 4 et 5, juste au point de code réutilisable - c'est juste du bruit. L'article 6 dit: "voir la référence à la classe d'instanciation du modèle 'std::_Vector_val<_Ty,_Alloc>' cours de compilation". En d'autres termes, cette erreur s'est produite dans le vecteur de code de modèle. La dernière partie est la plus intéressante: il pointe directement à la ligne de déclarer foo
dans votre propre code source, c'est compris où dans votre code source provient l'erreur de!
Donc, en additionnant les indices:
- Il provient de foo,
- Il provient de vecteur de code,
- Il essaie de copier un unique_ptr qui n'est pas autorisé.
- Conclusion: le vecteur essayé de copier l'un de ses éléments, ce qui n'est pas autorisé. Passer en revue le code pour
foo
et de vérifier quelque chose de provoquant une copie.
Puisque le compilateur seulement signaler au foo déclaration, si la cession est loin dans le code source de certains de chasse seront impliqués. Ce n'est évidemment pas l'idéal, mais je pense que cette approche en fin de compte vous donne plus de chance de corriger les erreurs en général. Vous allez commencer à reconnaître ce genre de vidage d'erreur signifie "vous avez copié un unique_ptr". Encore une fois, je ne suis pas à la défendre, il a certainement besoin de l'amélioration - mais je pense que de nos jours il y a juste assez d'informations dans la sortie combinée avec une bonne connaissance de la STL permet de résoudre le problème.