2010-09-14 151 views
0

我正在使用一个C++“事件”类,它允许调用委托中的一个或两个参数。类型定义后需要多个部分专业化和完全专业化<>

最近我已经添加了支持不需要论证的代表,但是当我specialze类使用没有我仍然需要添加<> afther类定义模板参数。

用法示例有一个/两个参数:

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 
{ 
}; 

回答

3

如果要调用一个函数不带任何参数,你必须编写foo()不仅仅是foo。这对于模板类型完全相同。 event不是一个类型,它是一个接受类型并返回类型的“函数”。 如果你真的想避免写括号,你仍然可以这样做:

typedef event<> event_; 
+0

无论有多少模板参数,Idea的类名都是“event”。随着typedef消失。我想没有解决方法? – Stormenet 2010-09-14 09:12:28

3

支架是必需的,因为C++的语法是这么说的。

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

template-id: 
      template-name < template-argument-list opt >