[comp.lang.c++] implicit conv to int in subscript

dan@dyndata.UUCP (Dan Everhart) (05/25/90)

Consider the following program:

class Index
   {
public:
   Index (int i) : v (i) {};
   operator int ()   { return v; };
private:
   int   v;
   };

Index x (0);
char  ac [10];

f ()
   {
   ac [x] = 'a';                // this line fails
   
   ac [(int) x] = 'a';
   ac [int (x)] = 'a';
   }


On the marked line, I expected the compiler to make an implicit
conversion of x to int, since the Index class has an operator int ()
function defined.  Zortech 2.06 gives the error message:

"opint.cpp", line 17 Syntax error: illegal pointer arithmetic
Had: <near *><char>
and: <struct Index>

The subsequent two lines, with their explicit conversions, compile
fine. 

Although I could not find any example in The C++ Primer of exactly
this nature, there is a close one on p. 283 where Lippman defines a
SmallInt class, with similar conversion operators and says, "A
SmallInt class object can now be used *anywhere* in int object can be
used."  (Emphasis mine.)  

Taking a clue from the error message, I also tried adding the line

	friend char & operator + (char *, Index);

to the class definition, attempting to provide assistance with the
pointer arithmetic.  It made no difference.

So, should this work?

randolph@ektools.UUCP (Gary L. Randolph) (05/30/90)

In article <684@dyndata.UUCP> dan@dyndata.UUCP (Dan Everhart) writes:
#
#Consider the following program:
#
#class Index
#   {
#public:
#   Index (int i) : v (i) {};
#   operator int ()   { return v; };
#private:
#   int   v;
#   };
#
#Index x (0);
#char  ac [10];
#
#f ()
#   {
#   ac [x] = 'a';                // this line fails
                                    ^^^^^^^^^^^^^^^It shouldn't
#   
#   ac [(int) x] = 'a';
#   ac [int (x)] = 'a';
#   }
#
#
#On the marked line, I expected the compiler to make an implicit
#conversion of x to int, since the Index class has an operator int ()
#function defined.  Zortech 2.06 gives the error message:

Your expectation is valid!

#"opint.cpp", line 17 Syntax error: illegal pointer arithmetic
#Had: <near *><char>
#and: <struct Index>

#The subsequent two lines, with their explicit conversions, compile
#fine. 

You should not have to cast!

#Although I could not find any example in The C++ Primer of exactly
#this nature, there is a close one on p. 283 where Lippman defines a
#SmallInt class, with similar conversion operators and says, "A
#SmallInt class object can now be used *anywhere* in int object can be
#used."  (Emphasis mine.)  

Lippman is correct.


#So, should this work?

Yes.
I have tested your code using Sun C++ 2.0 and all is as you had
hoped!  (minor point: Obviously f() should be defined as a void function)

Gary

kimura@zuken.co.jp (Naoto Kimura) (05/31/90)

In article <2670@ektools.UUCP> randolph@ektools.UUCP (Gary L. Randolph) writes:

 > 
 > #So, should this work?
 > 
 > Yes.
 > I have tested your code using Sun C++ 2.0 and all is as you had
 > hoped!  (minor point: Obviously f() should be defined as a void function)
 > 

I  have tested using Glockenspiel C Preprocessor, release 1.2 E too and 
there was no problem but trivial warning.


--
Kimura Naoto