需要多个部分专业化和完全专业化<>类型定义后
我正在使用一个 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
{
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您想调用不带参数的函数 foo,则必须编写
foo()
而不仅仅是foo
。这对于模板类型来说是完全相同的。event
不是类型,它是一个接受类型并返回类型的“函数”。如果你真的想避免写括号,你仍然可以这样做:
If you want to call a function foo with no arguments you have to write
foo()
not justfoo
. That is exactly the same for template types.event
is not a type, it is a "function" that takes types and return a type.If you really want to avoid writing the brackets, you can still do something like:
括号是必需的,因为 C++ 语法是这么规定的。
在 14.2/1 (temp.names/1) 中,<和>不是可选的,而 template-argument-list 是可选的。所以事件>>是有效的模板 ID,而事件不是由于缺少 <>。
Brackets are required because the C++ grammar says so.
In 14.2/1 (temp.names/1), < and > are not optional, while template-argument-list is. So event<> is a valid template-id while event is not due to lack of <>.