2016-03-26 14 views
1

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.

+0

clang ++ 3.7.0 kompiliert es. – kec

+0

Ihr Englisch ist in Ordnung. (Ich habe nichts bemerkt, was darauf hindeutet, dass du kein Muttersprachler bist, bis ich zur Entschuldigung gekommen bin.) –

Antwort

1

Dies sieht aus wie ein Compiler-Bug in Clang 3.5. Wenn ich den Code mit der Stammversion ausführen kompiliert es schön.

Verwandte Themen