Man*_*ons 2 c++ templates constructor
我有一个问题,因为我无法解释为什么某些东西在我可能犯了错误的地方有效。也许有人可以通过向我解释为什么会这样来帮助我改善我的 C++ 文化。
为了获得更好的透明度,我对代码进行了相当程度的简化。
我有一个模板虚拟类,如下所示:
template<class Node>
class tXmlNode
{
public:
tXmlNode();
virtual ~tXmlNode();
protected:
Node* node;
}
;
Run Code Online (Sandbox Code Playgroud)
由此我派生出几个类。
大多数情况下,我从它派生另一个模板类,例如这个:
template<class Part>
class tXmlMove : public tXmlNode<Part>
{
public:
tXmlMove(Part* part);
~tXmlMove();
protected:
int n_translate;
};
Run Code Online (Sandbox Code Playgroud)
使用此实现(简化为构造函数):
template<class Part>
inline tXmlMove<Part>::tXmlMove(Part* part) : tXmlNode<Part>(part)
{
//do some construction
}
;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将构造的某些部分委托给了父类构造函数。工作正常。
现在我有另一个派生类,但它派生自专门的父类(专门化是自我专门化,但来自具有类似专门父类的其他类,它的工作方式与此完全一样):
class tXmlCaseDefinition : public tXmlNode<tXmlCaseDefinition>
{
public:
tXmlCaseDefinition();
tXmlCaseDefinition(const pugi::xml_node& parent);
~tXmlCaseDefinition();
protected:
int n_shapes;
}
;
Run Code Online (Sandbox Code Playgroud)
(我想这是由于专业化,我不需要将此类构造为模板类。)
其非默认构造函数的实现如下:
nXml::tXmlPart::tXmlPart(
const pugi::xml_node& parent,
const int npos) : tXmlNode(parent, npos), this_id(""), this_type(""), description("")
{
}
;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我没有通过使用tXmlNode<tXmlCaseDefinition>(parent,npos)而是简单地委托给父构造函数tXmlNode(parent,npos)。我没有注意到这一点,它的工作原理出于某种神秘的原因。我根本不明白为什么。有人可以解释一下吗?
另外,我是否需要使用tXmlNode<Part>(part)或者可以使用tXmlNode(part)不是从专门的父类派生的类,还是只有当我有专门的父类时才可能?
非常感谢!
在模板类的定义中(更正式地说,“当前实例化”),有一个称为注入类名的东西,它只是没有参数的模板的名称。例如:
template<class T>
struct Foo
{
Foo* ptr; // refers to Foo<T>
};
Run Code Online (Sandbox Code Playgroud)
当您从模板类派生时,基类的注入类名将被继承。因此,您还可以引用没有模板参数的基类(假设该名称是可访问的;某些祖先没有从它私有继承):
template<class T>
struct Base
{
};
struct Derived : Base<int>
{
Base* ptr; // refers to Base<int>
};
Run Code Online (Sandbox Code Playgroud)
cppreference很好地总结了这里的所有标准(请参阅 [temp.local]、[basic.lookup] 和 [basic.scope.class])