[comp.lang.c++] pointer to member and pointer to function in SunC++ 2.0

ev@chorus.fr (Eric Valette) (03/26/90)

/* 
 *	Pointer to member and pointer to "normal" function :
 *	C++ 2.0 should check the consistency of what is allowed and what
 *	is not !!
 *	
 *	
 *	The following program was written on sun3/80 (sunOS4.0) using the
 *	Sun C++ 2.0 compiler
 */


class A {
	
public:
	int i;
	
	A() {}
	int func(int a) { this->i = a; return a;}
};

typedef int (A::*ptMemberA) (int);
typedef int (*ptFuncValid) (A*,int); 
typedef int (*badPtFuncType)   (int);    

A a;

main()
{
		ptMemberA   pFunc1 	= &A::func;
		ptFuncValid pFunc2 	= (ptFuncValid) &A::func;
/* line 30 */ 	ptFuncValid pFunc3    	= (ptFuncValid) pFunc1;	

		// produce a compiler error(see below)		
		// What's the difference between
		// this line and the previous one !!!
		// (works with glockenSpiel prepocessor release 1.2 d)
		// I think it is a bug !!!
		// -----------------------
		
		// Now look at the following line witch is syntacticaly correct
		// but do not produce what is expected
	
		ptFuncValid pFunc4    =  (* ((ptFuncValid*) &pFunc1)) ;		
		
		// Yet another possible bug
		
		badPtFuncType pFunc5 = (badPtFuncType) &A::func;

		// The compiler should be able to detect that the first 
		// parameter expected by *pfunc5 is not a pointer to an object 
		// of class  A (and also be able to produce at least a warning 
		// if it is not the case)
		
		// Now have a look at functions calls
		
		((&a)->*pFunc1) (1);		// works
		(*pFunc2) (&a,1);		// correct
/* line 57 */	(*pFunc4) (&a,1);		// should do the same thing

		// in fact produces a bus error at run time !!
		// works with release 1.2d of glockenSpiel.
		//-------------------------------------------

//		(*pFunc1)(1);   this line is (of course) not correct but
//				would have exactly the same effect as the
//				next one :

		(*pFunc5) (1);	//is correct but produces a bug at run-time
				// (the value of this is 1 in the func 
				// member function.)
		

}

/*-------------------Cut here-----------------------------------------------*/
/*
if you compile this program using the following command :

CC -o pfunc pfunc.cxx

it produces :

CC  pfunc.cxx:
"pfunc.cxx", line 30: sorry, not implemented:  
pointer to member of not first base 1 error

(trying to understain the error message is hard, isn't it)

if you remove line 30, it compiles but produces a bus error 
due to line 57.
	
============================================================================

I'll like to know how I can write something correct whitch would have the same 
effect as the line 30 in the previous version of C++ (1.2 [a-e]) .

===========================================================================

thanks,

   __                 
  /  `                   	Eric Valette
 /--   __  o _.          	Chorus Systemes
(___, / (_(_(__         	6 avenue Gustave Eiffel
				F-78182, St-Quentin-en-Yvelines-Cedex

Tel: +33 (1) 30 57 00 22	Fax: +33 (1) 30 57 00 66
E-mail: ev@chorus.fr		or ev%chorus.fr@mcsun.EU.net

*/