需要多个部分专业化和完全专业化<>在类型定义之后

时间:2010-09-14 08:46:22

标签: c++ templates partial-specialization

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

2 个答案:

答案 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 >