2016-11-05 1 views
0

Ich versuche, result_of für den Fall zu verwenden, wenn Callable Vorlagentyp zurückgibt und den folgenden Fehler (Clang ++) erhalten. Ich fügte auch einen einfachen Fall ein, in dem alles gut funktioniert.Wie verwendet man std :: result_of, wenn der Rückgabewert ein Vorlagentyp ist?

Fehler:

main.cpp:22:50: note: candidate template ignored: could not match '<type-parameter-0-1>' against 'std::__1::shared_ptr<int> (*)()' 
typename std::result_of<FunctionType<T>()>::type submit(FunctionType<T> f) { 

Code:

int f() { 
     int x = 1; 
     return x; 
    } 

    template<typename T> 
    std::shared_ptr<T> g() { 
     std::shared_ptr<T> x; 
     return x; 
    } 

    template <template<typename> class FunctionType, typename T> 
    typename std::result_of<FunctionType<T>()>::type submit(FunctionType<T> f) { 

     using result_type = typename std::result_of<FunctionType<T>()>::type; 

     result_type x; 
     return x; 
    } 

     template<typename FunctionType> 
     typename std::result_of<FunctionType()>::type submit2(FunctionType f) { 

     using result_type = typename std::result_of<FunctionType()>::type; 

     result_type x; 
     return x; 
    } 


    int main() 
    { 
     submit(g<int>); // error 
     submit2(f);  // ok 

     return 0; 
    } 

Antwort

1

g<int> vom Typ shared_ptr<int>() die, wenn sie durch die Funktion abklingt auf einen Zeiger auf diesen Typ (shared_ptr<int>(*)()) abgeleitet. FunctionType in submit ist daher nicht eine Vorlage und Sie können nicht Vorlagenargumente darauf verwenden.

Wenn Sie mehr Klarheit darüber haben, was Sie versuchen, können wir eine Lösung für Ihr Hauptproblem finden.

+0

Danke! Ich denke, ich verstehe es jetzt. –

Verwandte Themen