$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [proto] extends example not compiling
From: Eric Niebler (eric_at_[hidden])
Date: 2009-12-16 03:09:37
alfC wrote:
> Is this example, contained in the boost.Proto manual supposed to
> compile?
> 
> #include<complex>
> #include <boost/proto/core.hpp>
> #include <boost/proto/context.hpp>
> #include <boost/proto/debug.hpp>
> #include<boost/proto/extends.hpp>
> 
> template<class T, class Dummy = boost::proto::is_proto_expr>
> struct my_complex
> {
>     BOOST_PROTO_EXTENDS(
>         typename boost::proto::terminal<std::complex<T> >::type
>       , my_complex<T>
>       , boost::proto::default_domain
>     )
> };
> 
> int main()
> {
>     my_complex<int> c0, c1;
> 
>     c0 + c1; // OK, operator+ found now!
> }
> 
> I get this error (with gcc 4.3 and gcc 4.4):
> proto_complex.cpp:10: error: expected nested-name-specifier before
> typename
> proto_complex.cpp:10: error: two or more data types in declaration of
> proto_base_expr
> proto_complex.cpp:10: error: proto_base_expr has not been declared
> proto_complex.cpp:10: error: proto_base_expr has not been declared
I seem to recall seeing this error before with gcc. I think it's a 
compiler bug, but I haven't investigated.
> The strangest thing is that when I replace the macro by its explicit
> code the code seems to compile.
I think you'll find that if you replace this:
      BOOST_PROTO_EXTENDS(
          typename boost::proto::terminal<std::complex<T> >::type
        , my_complex<T>
        , boost::proto::default_domain
      )
with this:
      typedef
          typename boost::proto::terminal<std::complex<T> >::type
      terminal_type;
      BOOST_PROTO_EXTENDS(
          terminal_type
        , my_complex<T>
        , boost::proto::default_domain
      )
it should work.
-- Eric Niebler BoostPro Computing http://www.boostpro.com