RE: [ROOT] Problem with ShowMembers method with const data members.

From: Philippe Canal (pcanal@fnal.gov)
Date: Tue Mar 16 2004 - 20:10:24 MET


Hi Nick,

Thanks for reporting this problem.
The fix will be uploaded soon in the CVS repository.

Cheers,
Philippe.

-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Nick West
Sent: Tuesday, March 16, 2004 4:39 AM
To: roottalk
Subject: [ROOT] Problem with ShowMembers method with const data members.


Hi roottalk,

with the latest ROOT (from CVS this morning) on RH 7.3 with gcc 3.2 I am
having trouble with the generated dictionary method ShowMembers when
the class has a const data member.  The problem is that ShowMembers
is a non-const function (why?) and to examine the const member it
calls its ShowMembers function. In the simple example below fB is a
const
member function but the generated code is:-

//______________________________________________________________________
________
void A::ShowMembers(TMemberInspector &R__insp, char *R__parent)
{
      // Inspect the data members of an object of class A.
--
      if (R__ncp || R__cl || R__insp.IsA()) { }
      R__insp.Inspect(R__cl, R__parent, "fB", &fB);
      fB.ShowMembers(R__insp, strcat(R__parent,"fB."));
R__parent[R__ncp] = 0;
      TObject::ShowMembers(R__insp, R__parent);
}


and the compiler reports:-

MyDict.cc: In member function `virtual void
A::ShowMembers(TMemberInspector&,
   char*)':
MyDict.cc:182: passing `const B' as `this' argument of `virtual void
   B::ShowMembers(TMemberInspector&, char*)' discards qualifiers

in this simple case, although in a more complex class it can fail
completely with the error:-

MyDict.cc: In
   member function `virtual void A::ShowMembers(TMemberInspector&,
   char*)':
MyDict.cc:2162: no matching function for call to
`B::ShowMembers(TMemberInspector&,
   char*) const'
B.h:44: candidates
   are: virtual void ModelSelector::ShowMembers(TMemberInspector&,
char*) <near
   match>

In ROOT 3.10/01 it was fine:-

//______________________________________________________________________
________
void A::ShowMembers(TMemberInspector &R__insp, char *R__parent)
{
      // Inspect the data members of an object of class A.
--
      if (R__ncp || R__cl || R__insp.IsA()) { }
      R__insp.Inspect(R__cl, R__parent, "fB", &fB);
      const_cast<  B &>( fB ).ShowMembers(R__insp,
strcat(R__parent,"fB.")); R__parent[R__ncp] = 0;
      R__cl->SetStreamer("fB",R__A_fB);
      TObject::ShowMembers(R__insp, R__parent);
}

The const_cast allowed access to the const member.

The following demonstrate the problem:-

 rootcint -f MyDict.cc -c  a.h b.h LinkDef.h 

 g++ -c -I/$ROOTSYS/include MyDict.cc
 
where a.h:-

#ifndef A_H
#define A_H

#include "TObject.h"
#include "b.h"

class A : public TObject {
public:
  A():fB() {}
  const B& GetB() const { return fB; }
private:
  const B fB;

ClassDef(A,1)

};
#endif  //A_H

and b.h:-

#ifndef B_H
#define B_H

#include "TObject.h"

class B : public TObject {
public:
  B() : fNum(0) {}
  int  GetNum() const { return fNum; }
  void SetNum(int num) { fNum = num; }
private:
  int fNum;

ClassDef(B,1)

};
#endif  //B_H

Cheers,

Nick West



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:06 MET