2015-12-06 3 views
1

Я пытаюсь создать псевдоним типа std::function, потому что планирую использовать что-то еще в будущем. И я хотел бы иметь возможность легко сделать это изменение. Но я получаю сообщение об ошибке от компилятора, которого я действительно не понимаю. Я понимаю, что это значит, но я не понимаю этого в этом контексте.Тип псевдонима для std :: function

Пример:

#include <functional> 

template < typename Ret, typename... Args > using MyFunc = std::function< Ret(Args...) >; 

int main(int argc, char **argv) 
{ 
    MyFunc<void(int)> fn; 

    return 0; 
} 

Формирует:

..\main.cpp|7|required from here| 
..\main.cpp|3|error: function returning a function| 
+6

Если вы имели в виду 'fn' to' function ', то это будет' MyFunc '. Вы пытаетесь объявить переменную типа 'function ' - функцию, возвращающую функцию; следовательно, ошибка. –

+0

Спасибо @IgorTandetnik Ты спасатель жизни. –

+0

Обратите внимание, что 'std :: function' не является типом; это шаблон. –

ответ

6
template <typename F> 
using MyFunc = std::function<F>; 

void(int) является единым (функция) типа.

2

Несмотря на то, что принятый ответ является правильным, он предлагает несколько иной подход к тому, который был опубликован OP.

Для ясности следует сказать, что также решение, которое использует OP, является прекрасным.
Проблема в том, как он использовал тип MyFunc в своей функции main.

Это не должно быть:

MyFunc<void(int)> fn; 

Вместо этого, следующие один прав:

MyFunc<void, int> fn; 

Из-за этого, ниже код работает, как ожидалось:

#include <functional> 

template < typename Ret, typename... Args > 
using MyFunc = std::function< Ret(Args...) >; 

int main(int argc, char **argv) { 
    MyFunc<void, int> fn; // it was MyFunc<void(int)> fn; 
    return 0; 
} 
+0

, то как мы можем использовать '' в 'std :: function'? –

+1

@IvanKush Использование что-то вроде этого 'template struct F; template struct F {}; '. – skypjack