这是 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(使用前将#替换为@)