"Daniel Frey" <[EMAIL PROTECTED]> wrote in message [EMAIL PROTECTED]">news:[EMAIL PROTECTED]... > > > Compiler: GNU C++ version 3.2 20020927 (prerelease)
> I also tried the GCC 3.2.1, but without success. It compiles, but it > gives the wrong results. > > > Any ideas, or results from other compilers? >AFAICS the Intel 7 works fine. > > I was able to complie the attached code (with minor improvment) using strict > > Comeau and VC7.1 and boost 1.29.0. > One point about the implementation: The getC()-function isn't necessary, Silly me. It seems that I got used to that function. The following complied with VC6, VC7, VC7.1 and Comeau: template <typename B, typename D> struct is_base_and_derived { private: typedef char (&yes)[1]; typedef char (&no) [2]; template <typename T> static yes check(D const volatile *, T); static no check(B const volatile *, int); struct Host { operator B const volatile *() const; operator D const volatile *(); }; public: enum { result = sizeof(check(Host(), 0)) == sizeof(yes) }; }; struct B {}; struct B1 : B {}; struct B2 : B {}; struct D : B1, private B2 {}; typedef char Test[is_base_and_derived<B, D>::result]; typedef char Test[is_base_and_derived<B1,D>::result]; typedef char Test[is_base_and_derived<B2,D>::result]; typedef char Test[!is_base_and_derived<int,D>::result]; // Caveat VC6/7 BUG - // typedef char Test[!is_base_and_derived<D,D>::result]; I was able to complie the following code using GCC 3.1 which proves that GCC knows the required rules: template<typename T> long *f(D*, T); char *f(B*, int); struct Host1 { operator B*() const; operator D*(); }; long *x1 = f(Host1(), 0); template<typename T> long *g(B2*, T); char *g(B1*, int); struct Host2 { operator B1*() const; operator B2*(); }; char *x2 = g(Host2(), 0); BCC 5.6 selected the wrong function (x1) which proves that it disagree about the basic rules. Rani _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost