Mon programme a une classe avec un vecteur de Level
objets nommés levels
. En fonction de membre il y a cette ligne:erreur étrange en g ++
levels.push_back(level::Level());
J'ai fait plusieurs changements à mon programme aujourd'hui, et cette ligne de code a commencé segfaulting:
0x0804d248 in void std::vector<yarl::level::Level, std::allocator<yarl::level::Level> >::emplace_back<yarl::level::Level>(yarl::level::Level&&) (this=0x0,
__args#0=...) at /usr/include/c++/4.4/bits/vector.tcc:93
93 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
Je pensais que l'objet Level
peut-être en quelque sorte devenir corrompu, donc je déclarais à l'extérieur l'appel de fonction pour que je puisse l'inspecter dans gdb, comme ceci:
level::Level foo();
levels.push_back(foo);
Transforme ce ne compile pas. Il g ++ donne deux erreurs que je ne l'ai pas vu auparavant:
error: invalid conversion from 'level::Level (*)()' to 'int'
error: initializing argument 1 of 'level::Level::Level(int, int, int)'
Maintenant, le constructeur de Level
prend trois paramètres entiers, chacun avec des valeurs par défaut. Je pensais que l'on aurait pu se plaindre que je ne l'avais pas passé ces trois paramètres, même si elles ont par défaut, alors j'ai changé la première ligne pour passer la valeur des paramètres par défaut:
level::Level foo(1, 100, 100);
Cette compile maintenant, et encore segfaults, mais le fait à un endroit différent (même si un test identique):
0x0804c699 in std::vector<yarl::level::Level, std::allocator<yarl::level::Level> >::push_back (this=0x0, __x=...) at /usr/include/c++/4.4/bits/stl_vector.h:735
735 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
Je sais que cela est trop peu de code pour vous attendre les gars d'être en mesure de résoudre mon problème, mais peut-être que quelqu'un pourrait me dire un peu plus sur ce que ces erreurs signifient? Ces erreurs g ++ en particulier; Je ne sais pas pourquoi il n'accepterait pas un constructeur Level
vide étant donné que tous ses paramètres sont par défaut, et je n'ai aucune idée de ce que signifie la partie (*)()
de l'erreur (cela rend l'erreur très frustrante pour google).
'niveau :: Niveau foo();' est une fonction déclaration; Si vous voulez appeler le constructeur par défaut, omettez simplement les parenthèses. –
Niveau Niveau Niveau int int int, cela ressemble à un chant étrange. :-) – Omnifarious
@Rob, ma négligence. supprimé –