Boost logo

Boost Users :

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

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net