[Bug c++/71267] [C++14] recursive metafunction won't compile: no type named 'type'
pinskia at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed May 25 07:37:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71267
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |rejects-valid
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-05-25
Summary|recursive metafunction |[C++14] recursive
|won't compile: no type |metafunction won't compile:
|named 'type' |no type named 'type'
Ever confirmed|0 |1
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Here is a reduced such that we don't depend on any headers:
template <typename Ts, Ts... a>
struct tt{};
template <typename... Ts>
struct typelist {};
// specialization of typelist for std::integral_constant<>s
#ifdef WORKS
template <typename T, T... Ints>
struct integer_typelist {};
#else
template <typename T, T... Ints>
using integer_typelist = typelist<tt<T, Ints>...>;
#endif
// helper metafunction to generate typelist<> of integral_constant<>s by
// specifying a Start, End, and Step value
template <int Start, int End, int Step, typename Seq, bool B = (Start < End)>
struct make_integer_list_impl;
// specialization for: Start < End
template <int Start, int End, int Step, int... Indexes>
struct make_integer_list_impl<Start, End, Step, integer_typelist<int,
Indexes...>, true>
{
typedef typename make_integer_list_impl<
Start+Step, End, Step,
integer_typelist<int, Indexes..., Start>
>::type type;
};
// specialization for: Start >= End (terminate the recursion)
template <int Start, int End, int Step, int... Indexes>
struct make_integer_list_impl<Start, End, Step, integer_typelist<int,
Indexes...>, false>
{
using type = integer_typelist<int, Indexes...>;
};
// helper alias template
template <int Start, int End, int Step>
using make_integer_typelist = typename
make_integer_list_impl<Start, End, Step,
integer_typelist<int>>::type;
int main()
{
// typelist<
// std::integral_constant<int, 0>,
// std::integral_constant<int, 3>,
// std::integral_constant<int, 6>,
// std::integral_constant<int, 9>,
// std::integral_constant<int, 12>
// >
using t2 = make_integer_typelist<0, 13, 3>;
}
----- CUT ----
If we change integer_typelist to a template struct instead of an using alias,
it works.
More information about the Gcc-bugs
mailing list