Тип функции в шаблоне не компилируется - PullRequest
5 голосов
/ 29 декабря 2011

Я играл с переменными параметрами шаблона, используя gcc 4.6.1. Следующий код компилируется, как ожидается:

template<typename RetType, typename... ArgTypes>
class Event;

template<typename RetType, typename... ArgTypes>
class Event<RetType(ArgTypes...)>
{
public:
    typedef function<RetType(ArgTypes...)> CallbackType;

    void emit(ArgTypes...args)
    {
        for (CallbackType callback : callbacks)
        {
            callback(args...);
        }
    }

private:
    vector<CallbackType> callbacks;
};

Но, к моему удивлению, следующая "нормальная" версия, имеющая только один "тип аргумента", не компилируется:

template<typename RetType, typename ArgType>
class Event;

template<typename RetType, typename ArgType>
class Event<RetType(ArgType)> // <- error: wrong number of template arguments (1, should be 2)
{};

g ++ 4.6.1 выдает ошибку как в комментарии.

Кто-нибудь знает, почему это вызывает ошибку и как заставить ее работать? Кроме того, правильно ли я считаю, что приведенный выше код является формой «частичной специализации шаблона»?

Ответы [ 3 ]

5 голосов
/ 29 декабря 2011

Если вы хотите сделать свою собственную версию std::function для развлечения, она должна выглядеть следующим образом:

template<class Signature>
class Event;

template<class R, class... Args>
class Event<R(Args...)>{
  // ...
};

Почему ваша первая версия работает, уже объяснено @ronag, пакетом параметров (... в параметре шаблона) означает ноль или более .Код, который я привел выше, все еще является правильной сигнатурой, если вы хотите std:: / boost::function -подобный класс (int(int, double, char) - это тип функции, поэтому он может вписываться в одно объявление типа, например class Signature).

4 голосов
/ 29 декабря 2011
template<typename RetType, typename ArgType>
class Event;

Ожидается 2 аргумента шаблона, RetType и ArgType, вы даете ему только один RetType(ArgType).

template<typename RetType, typename... ArgType>
class Event;

Ожидается 1 или более аргументов шаблона, RetType и необязательно ArgType с.

1 голос
/ 29 декабря 2011

Я думаю, что ошибка связана с тем фактом, что если шаблон не является вариационным, то cpomiler ожидает стандартную форму, то есть класс Event<templateArg1, templateArg2>, что явно не то, чем вы его кормите.

По поводу специализации шаблона: я не согласен, если я не ошибаюсь, то, что вы делаете, это пересылаете объявление класса Event, а затем фактически объявляете его всего двумя строками позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...