0

我正在使用一个 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
{
};
4

2 回答 2

3

括号是必需的,因为 C++ 语法是这样说的。

在 14.2/1 (temp.names/1) 中,< 和 > 不是可选的,而 template-argument-list 是可选的。所以 event<> 是一个有效的模板 ID,而 event 不是由于缺少 <>。

template-id:
           template-name  < template-argument-list opt >
于 2010-09-14T09:10:11.313 回答
3

如果你想调用一个不带参数的函数foofoo() ,你不仅要写foo. 这与模板类型完全相同。event不是类型,它是一个接受类型并返回类型的“函数”。如果您真的想避免编写括号,您仍然可以执行以下操作:

typedef event<> event_;
于 2010-09-14T08:55:23.500 回答