我正在使用一个C ++“event”类,它允许一个或两个参数被称为委托。
最近我已经添加了对不需要参数的代理的支持,但是当我专注于该类不使用模板参数时,我仍然需要在课程中添加<> 定义
使用一个/两个参数的示例用法:
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
{
};
答案 0 :(得分:3)
如果你想要一个没有参数的函数 foo ,你必须写foo()
而不仅仅是foo
。这与模板类型完全相同。 event
不是一个类型,它是一个“函数”,它接受类型并返回一个类型。
如果你真的想避免写括号,你仍然可以这样做:
typedef event<> event_;
答案 1 :(得分:3)
括号是必需的,因为C ++语法是这样说的。
在14.2 / 1(temp.names / 1)中,&lt;和&gt;不是可选的,而template-argument-list是。所以事件&lt;&gt;是一个有效的模板ID,而事件不是由于缺少&lt;&gt;。
template-id:
template-name < template-argument-list opt >