Um mit C++ 11 zu üben, spiele ich mit variadischen Vorlagen.g ++ und clang ++ anderes Verhalten mit variadic Container
Insbesondere spiele ich mit einer Art rekursive variadic Containerklasse (onion
) und eine Funktion, die die Anzahl der Vorlagentypen (func()
) zurückgibt.
Ich stieß auf einen Fall, dass die Clang ++ (3.5.0) kann nicht kompilieren, während die g ++ (4.9.2) kompiliert und läuft ohne Probleme.
Ich habe es vereinfacht als
#include <iostream>
template <typename F, typename ... O>
struct onion;
template <typename F, typename S, typename ... O>
struct onion<F, S, O...>
{
F first;
onion<S, O...> others;
};
template <typename L>
struct onion<L>
{ L last; };
template <typename ... Args>
std::size_t func (onion<Args...> const &)
{ return sizeof...(Args); }
int main()
{
auto o = onion<int, char const *, float> { 23, { "abcd", {34.0f}} };
std::cout << func(o) << '\n';
return 0;
}
Klirren ++ folgt (3.5.0) gibt mir die folgende Compiler-Fehler
test.cpp:28:17: error: no matching function for call to 'func'
std::cout << func(o) << '\n';
^~~~
test.cpp:20:13: note: candidate template ignored: substitution
failure [with Args = <>]: too few template arguments for class template
'onion'
std::size_t func (onion<Args...> const &)
^ ~~~~~
1 error generated.
g ++ (4.9.2) kompiliert ohne Problem und, laufen, Ausgang 3
.
Meine Frage ist: Wer hat Recht?
Clang ++, geben einen Fehler, oder g ++, kompilieren?
ich hinzufügen, dass, wenn ich umschreiben func()
auf diese Weise
template <typename X, typename ... Args>
std::size_t func (onion<X, Args...> const &)
{ return 1U + sizeof...(Args); }
oder wenn ich neu definieren onion
auf diese Weise
template <typename ... O>
struct onion;
beide Klirren ++ und g ++ ohne Fehler kompilieren.
clang ++ 3.7.0 kompiliert es. – kec
Ihr Englisch ist in Ordnung. (Ich habe nichts bemerkt, was darauf hindeutet, dass du kein Muttersprachler bist, bis ich zur Entschuldigung gekommen bin.) –