Dans gdb, je peux appeler certaines fonctions de classe, mais d'autres “ne peuvent pas être résolus”. Pourquoi?

Je n'ai pas travaillé sur le partage des pointeurs encore .. je sais juste que le concept. Je suis en train de déboguer des fonctions en c++ suivant la classe, qui stocke les données d'un fichier XML (lire par xerces de la bibliothèque).

//header file
class ParamNode;
typedef boost::shared_ptr<ParamNode> PtrParamNode;

class ParamNode : public boost::enable_shared_from_this<ParamNode> {
public:
   ...
   typedef enum { DEFAULT, EX, PASS, INSERT, APPEND } ActionType;
   bool hasChildren() const;
   PtrParamNode GetChildren();
   PtrParamNode Get(const std::string&  name, ActionType = DEFAULT );
protected:
   ....
   ActionType defaultAction_;
}

Maintenant, si je suis le débogage d'un morceau de code dans lequel j'ai un exemple de l'pointeur vers la classe ParamNode, et il est appelé paramNode_

PtrParamNode paramNode_;
//read xml file with xerces
paramNode_ = xerces->CreateParamNodeInstance();
//now, the xml data is stored in paramNode_.
std::string probGeo;
//this works in the code, but not in (gdb)!!
paramNode_->Get("domain")->GetValue("gt",probGeo);
cout << probGeo << endl; //<-- breakpoint HERE

À l'aide de gdb je suis l'inspection de l' paramNode_ objet:

(gdb) p paramNode_
$29 = {px = 0x295df70, pn = {pi_ = 0x2957ac0}}
(gdb) p *paramNode_.px
$30 = {
  <boost::enable_shared_from_this<mainclass::ParamNode>> = {weak_this_ = {px = 0x295df70, pn = {pi_ = 0x2957ac0}}}, 
  _vptr.ParamNode = 0x20d5ad0 <vtable for mainclass::ParamNode+16>, 
  ...
  name_= {...}, 
  children_ = {size_ = 6, capacity_ = 8, data_ = 0x2969798},
  defaultAction_ = mainclass::ParamNode::EX, }

et imprimer ses membres:

(gdb) ptype *paramNode_.px
type = class mainclass::ParamNode : public boost::enable_shared_from_this<mainclass::ParamNode> {
  protected:
    ...
    mainclass::ParamNode::ActionType defaultAction_;
  public:
    bool HasChildren(void) const;
    mainclass::PtrParamNode GetChildren(void);
    mainclass::PtrParamNode Get(const std::string &, mainclass::ParamNode::ActionType);

Cependant, je ne peux appeler les fonctions HasChildren ou GetChildren, alors que l'appel de Get de gdb conduit à une erreur:

(gdb) p (paramNode_.px)->HasChildren()
 $7 = true
 (gdb) p (paramNode_.px)->GetChildren()
 $8 = (mainclass::ParamNodeList &) @0x295dfb8: {
   size_ = 6, 
   capacity_ = 8, 
   data_ = 0x29697a8
  }
(gdb) p (paramNode_.px)->Get("domain")
 Cannot resolve method mainclass::ParamNode::Get to any overloaded instance
(gdb) set overload-resolution off
(gdb) p (paramNode_.px)->Get("domain")
 One of the arguments you tried to pass to Get could not be converted to what the function wants.
(gdb) p (paramNode_.px)->Get("domain", (paramNode_.px).defaultAction_)
 One of the arguments you tried to pass to Get could not be converted to what the function wants.

Dans le code, l'exécution de la Get("domain") fonction fonctionne très bien. Pourquoi est-ce? Je suis reconnaissant si vous incluez les explications dans votre réponse, en raison de ma connaissance limitée du partage des pointeurs.

  • Peut-être que cela n'a rien à voir avec shared_ptr. Peut-être gdb juste ne peut pas convertir "domain" (const char [7], peut implicitement se désintègrent en un const char*) à const std::string& (par la construction d'un temporaire std::string) au moment de l'exécution. Je n'ai pas de gdb sous la main, mais je vous suggère d'essayer avec un code très simple comme std::size_t f(const std::string& s) { return s.length(); }, puis dans gdb p f("hello") et peut-être p f(std::string("hello")), pour voir si vous obtenez toujours l'erreur.
  • bonne idée. J'ai juste essayé ce. La fonction f travaille dans le code, cependant, (gdb) p f("hello") Attempt to take address of value not located in memory. (gdb) set overload-resolution on (gdb) p f("hsdflo") Cannot resolve function f to any overloaded instance. À l'aide de std:string dans gdb a entraîné une erreur de syntaxe...
InformationsquelleAutor Sebastian | 2013-05-24