From: Giovanni Piero Deretta (gpderetta_at_[hidden])
Date: 2007-05-24 09:15:42


On 5/24/07, Peder Holt <peder.holt_at_[hidden]> wrote:
> 2007/5/24, Minmin Gong <gongminmin_at_[hidden]>:
> [...]
> On GCC we use the native typeof mechanism, so your code is actually
> translated into this:
>
> int main() {
> std::vector<int> v;
> typedef typeof(boost::type_of::ensure_obj(v))::type type;
> }
>
> The simpler:
> typedef typeof(v)::type type;
>
> fails to compile as well, so this is a shortcomming in the compiler.

Well, vector has no 'type' type. Anyways, It fail)s for 'iterator' too:

   std::vector<int> v;
   typedef typeof(int)::iterator type;

> Unfortunately there is little we can do to fix this in Boost.Typeof.

This works though (at least with gcc 4.1.2):

  #include <vector>

  template<typename T>
  struct identity {
    typedef T type;
  };

  int main() {
     std::vector<int> v;
     typedef identity<typeof(v)>::type::iterator type;
  }

So BOOST_TYPEOF could include 'identity' in its expansion.

It might fail with more complex expression as I heard that gcc doesn't
like much typeof in template parameters (but never tested it).

gpd