thanks everybody. i got the stuff working, but with a lot of hassle.
the biggest problem is that C++ doesn't clearly differentiate bool from
int. Thus, a statement like while (len--) requires an operator bool(),
but that really just introduces implicit conversions to int, which leads
to huge numbers of ambiguities, major yuck. to avoid all the
ambiguities and other problems, i had to end up declaring both the
operations i wanted allowed [as public], and those i wanted disallowed
[as private] -- and i mean *ALL* of them -- short, unsigned short, int,
unsigned int, long, unsigned long, etc. etc. etc. to avoid these
dreaded ambiguities. what a major hassle -- and clearly this needs to
be rethought somewhat in the C++ design so that things like this are
easier to create.
Jan Vroonhof wrote:
Ben Wing <ben(a)666.com> writes:
>possible with an explicit cast, e.g. (Bytecount) x. Problem is, the
>"cast operator" that can be defined on a class seems to define
>implicit casts, not explicit. Is there any way to do what I want?
>
Yes you can.. C++ has an "explicit" keyword for this purpose.
The below example does it by defining an explicit copy constructor and
letting the compiler generate the conversion operators from that.
[Note that if you allow the uncommented conversions to int below, you
not strictly need the explicit copy constructors as]
struct charcount;
struct bytecount;
struct charcount {
int count;
charcount() { }
charcount(int i) : count(i) { }
// Allow type conversions
explicit charcount(bytecount bc);
int getcount() { return count;}
// operator int() { return getcount(); }
};
struct bytecount {
int count;
bytecount() { }
bytecount(int i) : count(i) { }
// Allow explicit type conversions through copy
explicit bytecount(charcount cc) : count(cc.getcount()) { }
int getcount() { return count ;}
// operator int() { return getcount(); }
};
inline charcount::charcount(bytecount bc) : count(bc.getcount()) { }
void foo(bytecount b);
int main()
{
bytecount b1 = 50;
bytecount b2;
charcount c1 = 100;
// Explit conversions (C style)
c1 = (charcount)b1;
b2 = (bytecount)c1;
foo((bytecount)c1);
// Explict conversion (C++ style)
c1 = charcount(b1);
b2 = bytecount(c1);
// Conversion to int works if the convertor operators are defined above
// int i1 = c1;
// int i2 = b1;
// These fail to compile because
// 1. We made the copy contructor explicit
// 2. Convertsion via int requires two conversions, if defined
c1 = b1;
b2 = c1;
foo(c1);
}
cd /tmp/
g++-3.0 bytecount.cpp -o bytecount
bytecount.cpp: In function `int main()':
bytecount.cpp:49: no match for `charcount& = bytecount&' operator
bytecount.cpp:5: candidates are: charcount& charcount::operator=(const
charcount&)
bytecount.cpp:50: no match for `bytecount& = charcount&' operator
bytecount.cpp:16: candidates are: bytecount& bytecount::operator=(const
bytecount&)
bytecount.cpp:51: conversion from `charcount' to non-scalar type `bytecount'
requested
Compilation exited abnormally with code 1 at Sun Apr 14 16:28:06