http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49153

           Summary: Compile error with template metafunctions (starting
                    with 4.5.x)
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: di...@roedu.net


Hi,

Starting with g++ 4.5.x this code does not compile anymore:
struct NullType;

template<typename T, typename U>
struct TypeList {
  typedef T head;
  typedef U tail;
};

template<typename First, template<typename, typename> class MetaFunction>
struct MetaBind1st {
  template<typename Second>
  struct type: MetaFunction<First, Second> {};
};


template<typename T, typename Elem>
struct AppendTypeListHelper {
  typedef Elem type;
};

template<typename T>
struct AppendTypeListHelper<T, NullType> {
  typedef TypeList<T, NullType> type;
};

template<typename T>
struct AppenderTypeList
{
  template<typename Elem>
  struct Function: MetaBind1st<T, AppendTypeListHelper>::template type<Elem>
{};
};


template<typename T>
struct Visitor;

template<typename Left, typename Right>
struct Visitor< TypeList<Left, Right> > {};


struct Test {};

template struct Visitor<AppenderTypeList<Test>::Function<NullType>::type>;

$ g++ file.cc -c -o /dev/null
file.cc:43:17: error: explicit instantiation of 'struct
Visitor<MetaBind1st<Test, AppendTypeListHelper>::type<NullType> >' before
definition of template

The error seems to be related to an issue where g++ (>=4.5.x) stops evaluating
"AppenderTypeList<Test>::Function<NullType>::type" to "TypeList<Test,
NullType>" (at least it doesn't evaluate it as such when looking for a
specialization of "Visitor" and thus it errors that it can't instantiate the
general "Visitor" that is incompletely defined).

It compiles fine with g++ < 4.5.x. Also, if I rename the nested struct "type"
from MetaBind1st to be called "Function" (and update its use from
AppenderTypeList) it compiles with g++ >= 4.5.x too.

I don't understand what the naming of that field has anything to do with the
code compiling or not.

Thanks!

Reply via email to