Hi,
It looks like CINT has trouble understanding pointer-to-pointer types
for member functions, although the return values appear to work
correctly if casted right. Raw data members work correctly, though
typedefs of pointer types cause additional difficulties. An example
follows:
test_ptop.h
---------------
#ifndef _test_ptop_h_
#define _test_ptop_h_
typedef Int_t *pint;
class X {
public:
Int_t** a; //!
pint* b; //!
Int_t** A() {return a;}
pint* B() {return b;}
X(Int_t *&ia , Int_t *&ib ): a(&ia),b(&ib) {}
ClassDef(X,1)
};
#endif
---------------
test_ptop.cxx
---------------
#include "Rtypes.h"
#include "test_ptop.h"
ClassImp(X)
---------------
LinkDef.h
---------------
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class X;
#pragma link typedef pint;
// #pragma link C++ class Temp<int>-; // works fine
#endif
---------------
Run example: (Linux system, running root 2.23/10)
rcas4008 % g++ -I$ROOTSYS/include -c test_ptop.cxx
rcas4008 % rootcint -f TestCint.cxx -c test_ptop.h LinkDef.h
Note: operator new() masked 1c
Note: operator delete() masked 1c
class X in test_ptop.h line 6 original base of virtual func
rcas4008 % g++ -I$ROOTSYS/include -c TestCint.cxx
rcas4008 % g++ -shared -Wl -o Test.so TestCint.o test_ptop.o
rcas4008 % root
*******************************************
* *
* W E L C O M E to R O O T *
* *
* Version 2.23/10 17 December 1999 *
* *
* You are welcome to visit our Web site *
* http://root.cern.ch *
* *
*******************************************
FreeType Engine v1.1 used to render TrueType fonts.
CINT/ROOT C/C++ Interpreter version 5.14.25, Nov 25 1999
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0] .L Test.so
root [1] Int_t x=5
root [2] Int_t y=6
root [3] Int_t *px=&x
root [4] Int_t *py=&y
root [5] X obj(px,py)
root [6] obj.A()
(Int_t*)0x85ff4e8 ****** Wrong type. Should be Int_t**.
root [7] *(obj.A())
(Int_t)140493664 ****** Wrong type. Should be Int_t*.
root [8] **((Int_t **)obj.A())
(Int_t)5
root [9] obj.B()
(pint)0x85ff490 ****** Wrong type. Should be pint *.
root [10] *obj.B()
(int)140493696 ****** Wrong type. Should be pint or
Int_t *
root [11] **((pint *)obj.B())
Error: Illegal pointer operation (tovalue) FILE:/tmp/29991laa_cint
LINE:1
Error: Illegal pointer operation (tovalue) FILE:/tmp/29991laa_cint
LINE:1
((unknown))0x85ff490
*** Interpreter error recovered ***
root [12] *((pint *)obj.B())
Error: Illegal pointer operation (tovalue) FILE:/tmp/29991maa_cint
LINE:1
((unknown))0x85ff490
*** Interpreter error recovered ***
root [13] obj.a
(Int_t**)0x85ff4e8 ****** This one works right.
root [14] obj.b
Warning: Unknown type 'unknown' in function argument handled as int
FILE:iostream.h LINE:521
Internal error: template function call G__ateval failed FILE: LINE:0
(pint*)0x85ff490
*** Interpreter error recovered ***
root [16] **((Int_t **)obj.B())
(Int_t)6 **** Can only get there by casting
to
the explicit pointer'd type.
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:17 MET