2015-05-08 16 views
8

Wie von ecatmur hervorgehoben, hat diese Frage bereits eine Antwort here. Diese Frage ist offensichtlich kein Duplikat von trailing return type using decltype with a variadic template function. Es versucht tatsächlich, eine einfachere Lösung für das Problem in diesem Thread vorzuschlagen. Die Frage ist, ob diese Lösung dem Standard entspricht, weil GCC und Clam darüber nicht einig sind. Lesen Sie sich die Frage ein wenig genauer durch, und Sie werden das merken.Namenssuche Problem, GCC und Klang stimmen nicht zu

Diese Frage wurde von this one inspiriert. Ich versuche, mit einer einfacheren Lösung als die, die kommen bereits zur Verfügung gestellt, und mit diesem Ende:

#include <iostream> 

struct S { 
    template <typename T> 
    static T sum(T t){ 
     return t; 
    } 

    template <typename T, typename ...U> 
    static auto sum(T t, U... u) -> decltype(t + sum(u...)) { 
     return t + sum(u...); 
    } 
}; 

int main() { 
    std::cout << S::sum(1, 1.5, 2) << '\n'; 
} 

Während diese Lösung mit GCC arbeitet, ist es nicht das Problem überhaupt auf Klirren zu lösen. Also, ich frage mich, welcher ist richtig.

+0

nicht für mich auf Klirren kompilieren: main. cpp: 10: 17: Hinweis: Kandidatenvorlage ignoriert: Substitutionsfehler [mit T = int, U = ]: keine übereinstimmende Funktion für Aufruf von 'sum' statische Autosumme (T t, U ... u) -> declltype (t + Summe (u ...)) { ^ ~~~ main.cpp: 5: 17: Hinweis: Kandidatenfunktionsvorlage Nr t lebensfähig: erfordert einzelnes Argument 't', aber 3 Argumente wurden angegeben statische automatische Summe (T t) { –

+0

@ecatmur Dies ist kein Duplikat. Lies meine Frage ein wenig genauer und du wirst das merken. – Lingxi

+0

@ecatmur Sie haben Recht. Ich werde diese Frage schließen. – Lingxi

Antwort

0

beste Abhilfe kam ich ist:

#include <iostream> 

struct S { 
    template <typename T> 
    static T sum(T t){ 
     return t; 
    } 

    template <typename S, typename T> 
    static auto sum(S s, T t) -> decltype(s + t) { 
     return s + t; 
    } 

    template <typename S, typename T, typename ...U> 
    static auto sum(S s, T t, U... u) -> decltype(s + t) { 
     return s + sum(t, u...); 
    } 
}; 

int main() { 
    std::cout << S::sum(1, 1.5, 2) << '\n'; 
} 

Klirren scheint mit der Lösung rekursive Funktion/Methode in decltype Richtlinie ein Problem zu haben ...

+0

'declltype (s + t)' kann sich von 'declltype (s + x)' mit 'x = t + u ...' unterscheiden. – Lingxi

+0

du scheinst recht zu haben - ich sah, dass es an deinem einfachen Beispiel arbeitet ... lass mich meine Antwort dann überdenken ... –