c++0x 模板中继承的构造函数

2023-11-29

这是 foo 类:

template <typename T>
struct foo
{
    foo()
    {
        t = nullptr;
    }

    foo(T* p, bool flag)
    {
        t = p;
    }
private:
    T* t;
};

这是班级栏:

template <typename T>
struct bar: public foo<T>
{
    using foo<T>::foo<T>;
};

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


template <typename T>
struct bar: public foo<T>
{
    using foo<T>::foo<T>;
};

为了让这个解析正确,你需要插入template之前foo<T>;,告诉编译器foo被视为模板名称(它无法查看foo<T>告诉自己,自从T未知)。但使用::template在 using 声明中不允许使用。该名称也不指代所有构造函数bar:相反,它会引用特定的构造函数模板特化(T是这样的构造函数的模板参数)如下

template<typename T>
foo();

此外,使用声明使用 a 是无效的template-id (like foo<T>)作为其名称(实际上禁止它引用函数模板专业化,此外还禁止名称转换函数模板专业化),因此即使您使用::template(如果可能的话),此时您仍然会出错。

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

  • 如果该类使用 template-id 命名(形式名称foo<T>)并且最后一部分与模板名称匹配(所以,foo<T>::foo or TTP<T>::TTP with TTP是模板模板参数)。
  • 如果最后部分与类名匹配(所以,foo::foo or T::T, with T是模板参数)。

这两个附加规则仅在 using 声明中有效。而它们自然不会出现在 C++03 中。 C++03 中也存在的另一个规则是:如果最后部分命名注入的类名,那么这个限定名也指构造函数:

  • foo::foo因此会起作用。但仅凭这条规则,T::T (where T表示类foo)不起作用,因为foo没有会员叫T.

因此,根据特殊规则,您可以编写

using foo<T>::foo;
using bar::foo::foo; // valid too

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

现在您明白为什么您尝试的初始名称将引用构造函数模板专门化(如果允许的话):因为foo<T>::foo部分将命名所有构造函数,并且<T>接下来将过滤掉模板并传递类型参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++0x 模板中继承的构造函数 的相关文章

随机推荐