Ich schreibe etwas TMP-schweren Code für g ++ (Version 4.8.1_1, Macports) und clang ++ (Version 3.3, Macports). Während g ++ die folgende Code-Liste mit UNBRIDLED FURY ablehnt, kompiliert clang ++ mit grace und pracht.g ++ Fehler mit partieller Template-Spezialisierung
- Welcher Compiler ist in der rechten? (Ich vermute stark, dass es g ++ ist, aber ich möchte vor dem Einreichen eines Fehlerberichts von anderen Rückversicherung erhalten.)
- Haben Sie irgendwelche einfachen oder eleganten Problemumgehungen? (Ich brauche Vorlage Aliase zu verwenden, so Umschalten auf structs, die g verursacht ++, den Code zu akzeptieren, ist keine Option.)
Hier ist die Codeliste gemacht nur für Sie.
template <class... Ts>
struct sequence;
template <int T>
struct integer;
// This definition of `extents` causes g++ to issue a compile-time error.
template <int... Ts>
using extents = sequence<integer<Ts>...>;
// However, this definition works without any problems.
// template <int... Ts>
// struct extents;
template <int A, int B, class Current>
struct foo;
template <int A, int B, int... Ts>
struct foo<A, B, extents<Ts...>>
{
using type = int;
};
template <int B, int... Ts>
struct foo<B, B, extents<Ts...>>
{
using type = int;
};
int main()
{
using t = foo<1, 1, extents<>>::type;
return 0;
}
ist hier g ++ 's Ausgang:
er.cpp: In function 'int main()':
er.cpp:39:41: error: ambiguous class template instantiation for 'struct foo<1, 1, sequence<> >'
using t = typename foo<1, 1, extents<>>::type;
^
er.cpp:26:8: error: candidates are: struct foo<A, B, sequence<integer<Ts>...> >
struct foo<A, B, extents<Ts...>>
^
er.cpp:32:8: error: struct foo<B, B, sequence<integer<Ts>...> >
struct foo<B, B, extents<Ts...>>
^
er.cpp:39:43: error: 'type' in 'struct foo<1, 1, sequence<> >' does not name a type
using t = typename foo<1, 1, extents<>>::type;
^
Hier ist Klirren ++' s Ausgabe:
Vielen Dank für Ihre Hilfe!
'+ 1' für Witze allein :) Ich würde auch wetten, dass Clang hier ist. –
Der 'typenname' in' main' wird nicht benötigt –
@ DavidRodríguez-dribeas Danke, es ist zur Gewohnheit geworden ... –