Требуется множественная частичная специализация и полная специализация <> после определения типа

Я использую класс C++ "событие", который позволял одному или двум аргументам в быть вызванными делегатами.

В последнее время я добавил поддержку для делегатов, которые не требуют аргументов, однако, когда я специализирую класс на использовании аргументов шаблона, я все равно должен добавить <> после определения класса.

Пример использования с одним / двумя аргументами:

class Example 
{
public:
    event<int> SingleArgEvent;
    event<int, int> DoubleArgEvent;
};

А вот пример без аргументов:

class Example 
{
public:
    event<> NoArgTest1; // compiles just fine
    event NoArgTest2;   // gives me C2955: 'event' : use of class template requires template argument list
};

Как это работает с скобками, я не вижу причины, почему они должны быть там. Вот код специализации класса:

class null_typelist {};
/** event template **/
template <class Targ1 = null_typelist, class Targ2 = null_typelist>
class event : public event2_base<Targ1, Targ2>
{
};

template <class Targ>
class event<Targ, null_typelist> : public event1_base<Targ>
{
};

template <>
class event<null_typelist, null_typelist> : public event0_base
{
};

2 ответа

Решение

Если вы хотите вызвать функцию foo без аргументов, вы должны написать foo() не просто foo, Это точно так же для типов шаблонов. event это не тип, это "функция", которая принимает типы и возвращает тип. Если вы действительно хотите избежать написания скобок, вы все равно можете сделать что-то вроде:

typedef event<> event_;

Скобки требуются, потому что грамматика C++ говорит так.

В 14.2/1 (temp.names/1), <и> не являются обязательными, в то время как template-arguments-list есть. Таким образом, событие<> является допустимым идентификатором шаблона, в то время как событие не связано с отсутствием <>.

template-id:
           template-name  < template-argument-list opt >
Другие вопросы по тегам