2016-11-05 3 views
0

Я пытаюсь использовать result_of для случая, когда Callable возвращает тип шаблона и получает следующую ошибку (clang ++). Я также включил простой случай, когда все работает нормально.Как использовать std :: result_of, когда возвращаемое значение является типом шаблона?

Ошибка:

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) { 

Код:

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; 
    } 

ответ

1

g<int> имеет тип shared_ptr<int>(), который, когда выводится с помощью функции затухает на указатель на этот тип (shared_ptr<int>(*)()). FunctionType в submit поэтому не шаблон и вы не можете использовать аргументы шаблона на нем.

Если вы можете быть более ясными о том, что вы пытаетесь сделать, мы сможем найти решение вашей основной проблемы.

+0

Спасибо! Кажется, я понял это сейчас. –

Смежные вопросы