Re: Pointer-to-member operator and member functions

From: Pasha Murat (murat@cdfsga.fnal.gov)
Date: Tue Jul 21 1998 - 18:46:58 MEST


	I suspect that 2 out of 3 problems you reported are due to you 
are using Microsoft "dialect" of C++ and are not related to CINT. 
I tried to compile your example with KAI compiler (the compiler which input 
language is the closest one to ANSI C++) and got the following diagnostics:
--------------------------------------------------------------------------------
/data35/upgrade/murat/run1>KCC -c --strict test1.cc
"test1.cc", line 59: error: nonstandard form for taking the address of a
          member function
        b.sqr(ff,foo::f,2.0);   // CINT does not understand foo::f (ptr to member
                 ^

"test1.cc", line 61: error: nonstandard form for taking the address of a
          member function
        b.sqr(ff,foo::g,2.0);   // CINT does not understand foo::g
                 ^
2 errors detected in the compilation of "test1.cc".
--------------------------------------------------------------------------------
					Regards, Pasha.




Jonathan M. Gilligan writes:
 > I need to have a function that accesses an arbitrary member function of a
 > class through a pointer (I need to integrate member functions and don't
 > want to write a separate integration routine for each function that I want
 > to integrate. I can't use the TF1::Integrate because the functions I need
 > to integrate are pure virtual member functions of an abstract base class.
 > The ARM indicates that the right way to go with this in standard C++ is to
 > use the pointer-to-member operators .* and ->* (ARM section 5.5). However,
 > CINT does not seem to implement these operators (see test program below).
 > 
 > I would like to request that a future release implement these operators and
 > to ask whether there is a workaround. Can I call a member function of a
 > class through a pointer in CINT?
 > 
 > The following program runs perfectly under my regular C++ compiler (M'Soft
 > VC++ 5.0 SP3). However under Root's CINT I get these error messages: 
 > 
 > Error: No symbol foo::f in current scope  FILE:boo.cpp LINE:56
 > Error: class,struct,union or type fu.*fn not defined  FILE:boo.cpp LINE:47
 > Error: No symbol foo::g in current scope  FILE:boo.cpp LINE:57
 > Error: class,struct,union or type fu.*fn not defined  FILE:boo.cpp LINE:47
 > 
 > //====================== boo.cpp ========================
 > class foo
 > {
 > private:
 > public:
 > 	foo();
 > 	~foo();
 > 	virtual double f(double x) const;
 > 	virtual double g(double x) const;
 > };
 > 
 > class bar
 > {
 > public:
 > 	bar();
 > 	~bar();
 > 	double sqr(const foo& fu, double (foo::*fn)(double) const, double x) const;
 > };
 > 
 > foo::foo()
 > {
 > }
 > 
 > foo::~foo()
 > {
 > }
 > 
 > double foo::f(double x) const
 > {
 > 	return x + 1.0;
 > }
 > 
 > double foo::g(double x) const
 > {
 > 	return 2.0 * x;
 > }
 > 
 > bar::bar()
 > {
 > }
 > 
 > bar::~bar()
 > {
 > }
 > 
 > double bar::sqr(const foo& fu, double (foo::*fn)(double) const, double x)
 > const
 > {
 > 	double y = (fu.*fn)(x);	// CINT does not seem to understand the .*
 > operator here
 > 	return y * y;
 > }
 > 
 > void boo ()
 > {
 > 	bar b;
 > 	foo ff;
 > 
 > 	b.sqr(ff,foo::f,2.0);	// CINT does not understand foo::f (ptr to member
 > function)
 > 	b.sqr(ff,foo::g,2.0);	// CINT does not understand foo::g
 > }
 > //===================================== end of boo.cpp
 > =================================
 > ===========================================================================
 > Jonathan M. Gilligan                     <jonathan.gilligan@vanderbilt.edu>
 > Research Assistant Professor and Associate Director          (615) 343-2957
 > Center for Molecular and Atomic Studies at Surfaces           Fax: 343-1708
 > Dept. of Physics and Astronomy, Box 1807-B                   Sec'y 322-6438
 > Vanderbilt University, Nashville, TN 37235                    Lab: 343-7578



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:35 MET