$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Eric Niebler (eric_at_[hidden])
Date: 2005-05-21 11:15:31
Arkadiy Vertleyb wrote:
> Here is the minimal example:
> 
> // ----
> #include "boost/mpl/vector.hpp"
> #include "boost/mpl/size_t.hpp"
> 
> template<class T> T make();
> 
> template<class T>
> struct et
> {
>     typedef boost::mpl::vector1<int> type;
> };
> 
> template<class T>
> char(&sz(const T&))[
>     boost::mpl::size<
>         typename et<T>::type
>     >::value
> ];
> 
> template<class T, class U>
> struct add
> {
>     typedef boost::mpl::vector1<
>         boost::mpl::size_t<sizeof(sz(make<T>() + make<U>()))>
>         //boost::mpl::size_t<sizeof(sz(T() + U()))> -- doesn't help here
>     > type;
> };
> 
> int main()
> {
>     return 0;
> }
> // ----
> 
> This example compiles fine with GCC, but both MS compilers choke on it.
I have experienced this problem before, and the fix is to calculate the 
return type of the sz() function as a separate step:
#include "boost/mpl/vector.hpp"
#include "boost/mpl/size_t.hpp"
template<class T> T make();
template<class T>
struct et
{
     typedef boost::mpl::vector1<int> type;
};
template<class T>
struct sizer
{
     typedef char(&type)[
         boost::mpl::size<
             typename et<T>::type
         >::value
     ];
};
template<class T>
typename sizer<T>::type sz(const T&);
template<class T, class U>
struct add
{
     typedef boost::mpl::vector1<
         boost::mpl::size_t<sizeof(sz(make<T>() + make<U>()))>
     > type;
};
This compiles with VC7.1 and with gcc. I don't have VC8 beta installed.
> 
> Do Microsoft people read this list, or should I post it elsewhere?
> 
Report the bug at the product feedback center:
http://lab.msdn.microsoft.com/productfeedback/
-- Eric Niebler Boost Consulting www.boost-consulting.com