这是foo类: 通用标签

这是课程栏: 通用标签

继承构造函数是否正确的语法?如果我使用“使用foo :: foo;”然后Visual C ++ 2010的编译器死亡。 那么基本上如何在VC ++ 2010中从模板类继承构造函数?

有帮助吗?

解决方案

通用标签

为使此解析正确,您需要在template之前插入foo<T>;,以告知编译器将foo视为模板名称(由于foo<T>是未知的,因此无法通过T告诉自己)。但是在use声明中不允许使用::template。该名称也不是指bar的所有构造函数:相反,它是指这样的构造函数的特定的构造函数模板专门化(T是模板参数), 通用标签

此外,使用声明将template-id(例如foo<T>)用作名称是无效的(实际上禁止使用它来引用功能模板专业化,也禁止在名称转换功能模板专业化中添加) ),因此即使您使用::template纠正了解析问题(如果可能的话),此时您仍然会出错。

引入继承的构造函数时,添加了特殊规则,允许使用语法规则来引用构造函数:如果您具有限定ID(基本上是使用...::...的限定名称),并且最后一个限定在最终零件名称之前一个特定的类,那么您可以通过另外两种方式表示该类的构造函数:

  • 如果该类是使用template-id(格式为foo<T>的名称)命名的,并且最后一部分与模板名称匹配(因此,foo<T>::fooTTP<T>::TTPTTP是模板模板参数)。
  • 如果最后一部分与类名匹配(例如,foo::fooT::TT是模板参数)。

    这两个附加规则仅在using声明中有效。而且它们自然不存在于C ++ 03中。 C ++ 03中还存在另一条规则:如果最后一部分为注入的类名命名,则此限定名也将指向构造函数:

    • foo::foo将为此工作。但是仅凭此规则,T::T(其中T表示类foo)将不起作用,因为foo没有名为T的成员。

      因此,有了适当的规则,您就可以编写 通用标签

      第二个也是有效的:foo是注入的类名,它被注入基类foo<T>中,并继承为bar。我们通过bar::foo引用该名称,然后添加最后一部分foo,它再次引用注入的类名称,以表示`foo的构造函数。

      现在您了解了为什么尝试使用的初始名称会引用构造函数模板特化(如果允许的话):因为foo<T>::foo部分会命名所有构造函数,然后跟随的<T>会过滤掉模板并传递类型参数。

其他提示

如果您的编译器尚不支持继承构造函数,但支持可变参数宏,可变参数模板和右值引用以及非常方便的type_trait,则这是一个非常不错的解决方法: 通用标签

如果您还没有is_constructible,那么基本的想法就是没有它,但是“继承的构造函数”将过于贪婪。

您不需要第二个模板参数; 通用标签

应该做

编辑我撤消说这适用于g ++-4.4.1,但是当该功能可用时这应该是正确的语法

其他答案已经很好地解释了C ++ 0x中继承构造函数的工作原理。但是,在撰写本文时,还没有编译器完全实现了整个C ++ 0x功能集。不幸的是,这意味着VC ++ 2010尚不支持继承构造函数。

C ++ 0x标准尚未发布。标准的最终草案将在3月,但ISO还要花几个月的时间发布。在此期间,编译器编写者正在推出功能,以便在标准最终定稿时尽可能与C ++ 0x兼容。

我相信最新版本的GCC支持继承构造函数,因此,如果您现在必须尝试一下,则可以使用它。当然,对C ++ 0x的支持是试验性的,并且会随着发现错误等而改变。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top