Boost logo

Boost :

From: Fernando Cacciola (fernando_cacciola_at_[hidden])
Date: 2003-03-24 07:32:45


/*
Pavel Vozenilek <pavel_vozenilek_at_[hidden]> wrote in message
news:b59su5$3ih$1_at_main.gmane.org...
> I use Borland C++ Builder 6, update 4, STLPort 4.5.1 (provided by Borland)
> and Boost is 1.30.0beta1.
>

Sorry for the delay...

> Following snippet of code fails:
>
> -----------------
> #include <boost/optional.hpp>
> #include <utility>
>
> void foo(const boost::optional<std::pair<unsigned, unsigned> >& aux =
> boost::optional<std::pair<unsigned, unsigned> >())
> {}
>
> int main() {}
> -----------------
>
> with error message:
> [C++ Error] Unit1.cpp(12): E2188 Expression syntax
> [C++ Error] Unit1.cpp(12): E2299 Cannot generate template specialization
> from '_STLD::pair<_T1,_T2>'
> [C++ Error] Unit1.cpp(12): E2299 Cannot generate template specialization
> from 'boost::optional<T>'
> [C++ Error] Unit1.cpp(13): E2257 , expected
> [C++ Error] Unit1.cpp(33): E2151 Type mismatch in default value for
> parameter 'aux'
> [C++ Error] Unit1.cpp(12): E2293 ) expected
>
>
> The same code compiles OK with Intel C++ 7.0.
>
> If I use typedef it works OK with both BC++B and Intel C++:
> -----------------
> #include <boost/optional.hpp>
> #include <utility>
>
> typedef boost::optional<std::pair<unsigned, unsigned> > AType;
>
> void foo(AType aux = AType())
> {}
>
> int main() {}
> -----------------
>
Hmm..
I can't reproduce the problem here with the 1.30.0 release,
BCB6, update 4, from within the IDE.
Which command line options are you using?

>
> Borland also fails with this construct:
> -----------------
> #include <boost/optional.hpp>
>
> int main()
> {
> boost::optional<int> aux(0);
> if (aux && *aux == 0) {
> aux.reset(1);
> }
> }
> -----------------
>
> with this error message:
> [C++ Error] Unit1.cpp(24): E2094 'operator&&' not implemented in type
> 'boost::optional<int>' for arguments of type 'bool'
>
> Intel C++ 7.0 compiles and executes this snippet OK.
>
> This works in BC++B:
> -----------------
> #include <boost/optional.hpp>
>
> int main()
> {
> boost::optional<int> aux(0);
> if ((!!aux) && *aux == 0) {
> aux.reset(1);
> }
> }
> -----------------
>
This one is a known Bortland bug.
In fact, operator!() is provided precisely in order
to allow the second form (with !!) to be used when
needed.
In Borland, the safe_bool operators works only if
the optional is the only element in the boolean
expression, as in: if ( aux ) ...

Thanks for the report!

Fernando Cacciola


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk