Re: [sigc] libsigc++ on G++ 3.2
- From: Murray Cumming <murrayc murrayc com>
- To: Paul Pogonyshev <pogonyshev gmx net>
- Cc: libsigc++ list <libsigc-list gnome org>
- Subject: Re: [sigc] libsigc++ on G++ 3.2
- Date: Sun, 12 Jun 2005 10:45:24 +0200
On Sat, 2005-06-11 at 20:54 +0300, Paul Pogonyshev wrote:
> Hi,
>
> I managed to compile libsigc++ 2.0.14 on G++ 3.2 using the patch below.
Great. Could you please add this to this bug, ideally with the configure
test described below. Please remember to patch the ChangeLog, and create
a cvs patch with
cvs diff -up > something.patch
http://bugzilla.gnome.org/show_bug.cgi?id=168261
> Basically, I just uncommented the declaration of inner class, as suggested
> in the comments. However, I propose to make it somewhat more automated and
> based on whether a preprocessor macro is defined.
>
> Currently, WRAP_IS_BASE_CLASS_ is never defined, since I couldn't quite
> understand `sigc++config.h.in'.
You need to add a test to scripts/cxx.m4 and #undefine the new define in
sigc++config.h.in. There should be descriptions of similiar additions in
the ChangeLog.
> However, it should be possible to determine
> G++ version like this (modified from GNU Go source, where I added this some
> time ago):
>
> AH_TEMPLATE([GXX_MAJOR_VERSION], [Define to G++ major version.])
> AH_TEMPLATE([GXX_MINOR_VERSION], [Define to G++ minor version.])
>
> if test "$GXX" = "yes"; then
>
> dnl M4 escaping of brackets
> [GXX_VERSION=`$CXX --version | sed '1!D;s/^[^0-9]*\([0-9]\+\.[0-9]\+\).*$/\1/'`
> GXX_MAJOR_VERSION=`echo $GXX_VERSION | sed 's/^\([0-9]\+\).*$/\1/'`
> GXX_MINOR_VERSION=`echo $GXX_VERSION | sed 's/^[0-9]\+\.\(.*\)$/\1/'`]
>
> else
> GXX_MAJOR_VERSION=0
> GXX_MINOR_VERSION=0
> fi
>
> So that later it is possible to do sth. like
>
> #define WRAP_IS_BASE_CLASS_ (GXX_MAJOR_VERSION == 3 && GXX_MINOR_VERSION == 2)
>
> By the way, as far as I know `friend class x;' itself serves as a forward
> declaration, so that an additional `class x;' is redundant.
>
> Paul
>
>
> P.S. It seems that `type_traits.h' gets installed, so this approach
> will not work... I dunno. Maybe you could have a single line
> header file with definition of WRAP_IS_BASE_CLASS_ and then
> install it too. It could be generated by `configure' script.
> If you are interested, I can have a stab at this.
>
>
> --- /home/paul/type_traits.h.orig 2005-06-11 19:54:09.000000000 +0300
> +++ /home/paul/libsigc++-2.0.14/sigc++/type_traits.h 2005-06-11 20:02:20.000000000 +0300
> @@ -99,25 +99,40 @@ private:
>
> //Allow the test inner class to access the other (big) inner class.
> //The Tru64 compiler needs this. murrayc.
> - //struct test;
> - //friend struct test;
> + //struct internal;
> + //friend struct internal;
> +
> +#if WRAP_IS_BASE_CLASS_
> +
> + //Some compilers, e.g. G++ 3.2, require these pseudo-functions to be
> + //wrapped up. Else they give errors.
> + struct internal
> + {
> + static big is_base_class_(...);
> + static char is_base_class_(typename type_trait<T_base>::pointer);
> + };
> +
> +public:
> + static const bool value =
> + sizeof(internal::is_base_class_(reinterpret_cast<typename type_trait<T_derived>::pointer>(0))) ==
> + sizeof(char);
> +
> +#else // not WRAP_IS_BASE_CLASS_
>
> //The AIX xlC compiler does not like these 2 functions being in the inner class.
> //It says "The incomplete type "test" must no be used as a qualifier.
> //It does not seem necessary anyway. murrayc.
>
> - //struct test {
> - //For gcc 3.2, try uncommenting the "struct test" inner class declaration, and also using a test:: prefix below.
> - //If it works then submit a patch. A new configure-time compiler-ability check would be even better. murrayc.
> - static big is_base_class_(...);
> - static char is_base_class_(typename type_trait<T_base>::pointer);
> - //};
> + static big is_base_class_(...);
> + static char is_base_class_(typename type_trait<T_base>::pointer);
>
> public:
> static const bool value =
> sizeof(is_base_class_(reinterpret_cast<typename type_trait<T_derived>::pointer>(0))) ==
> sizeof(char);
>
> +#endif // not WRAP_IS_BASE_CLASS_
> +
> void avoid_gcc3_warning_(); //Not implemented. g++ 3.3.5 (but not 3.3.4, and not 3.4) warn that there are no public methods, even though there is a public variable.
> };
--
Murray Cumming
murrayc murrayc com
www.murrayc.com
www.openismus.com
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]