c++ - 为什么有些情况下可以省略模板参数规范?

标签 c++ templates constructor

我有一个问题,因为我无法解释为什么某些东西在我可能犯了错误的情况下有效。也许有人可以通过向我解释为什么会这样来帮助我提高我的 C++ 文化。

为了获得更好的透明度,我对代码进行了相当程度的简化。

我有一个如下所示的模板虚拟类:

    template<class Node>
    class tXmlNode
    {
    public:
        tXmlNode();
        virtual ~tXmlNode();

    protected:
        Node* node;
    }
    ;

由此我派生出几个类。

大多数情况下,我从它派生另一个模板类,例如这个:

    template<class Part>
    class tXmlMove : public tXmlNode<Part>
    {
    public:
        tXmlMove(Part* part);
        ~tXmlMove();

    protected:
        int n_translate;
    };

使用此实现(简化为构造函数):

    template<class Part>
    inline tXmlMove<Part>::tXmlMove(Part* part) : tXmlNode<Part>(part)
    {
        //do some construction
    }
    ;

正如您所看到的,我将构造的某些部分委托(delegate)给了父类构造函数。工作正常。

现在我有另一个派生类,但它是从专门的父类派生的(专门化是 self 专门化,但来自具有类似专门父类的其他类,它的工作方式与此完全一样):

    class tXmlCaseDefinition : public tXmlNode<tXmlCaseDefinition>
    {
    public:
        tXmlCaseDefinition();
        tXmlCaseDefinition(const pugi::xml_node& parent);

        ~tXmlCaseDefinition();

    protected:
        int n_shapes;
    }
    ;

(我猜是由于特化,我不需要将此类构造为模板类。)

其非默认构造函数的实现如下:

nXml::tXmlPart::tXmlPart(
    const pugi::xml_node& parent, 
    const int npos) : tXmlNode(parent, npos), this_id(""), this_type(""), description("")
{
}
;

如您所见,我没有使用 tXmlNode<tXmlCaseDefinition>(parent,npos) 委托(delegate)给父构造函数。但只是tXmlNode(parent,npos) 。我没有注意到这一点,它的工作原理出于某种神秘的原因。我根本不明白为什么。有人可以解释一下吗?

我还需要使用 tXmlNode<Part>(part)或者我可以使用tXmlNode(part)相反,对于不是从专门的父类派生的类,还是只有当我有专门的父类时才可能?

非常感谢!

最佳答案

在模板类(更正式地说,“当前实例化”)的定义中,有一个称为“注入(inject)类名称”的东西,它只是没有参数的模板名称。例如:

template<class T>
struct Foo
{
   Foo* ptr; // refers to Foo<T>
}; 

当您从模板类派生时,将继承基类的注入(inject)类名称。因此,您还可以引用没有模板参数的基类(假设该名称是可访问的;某些祖先没有从它私有(private)继承):

template<class T>
struct Base
{
};

struct Derived : Base<int>
{
   Base* ptr; // refers to Base<int>
};

cppreference这里很好地总结了所有标准(请参阅 [temp.local]、[basic.lookup] 和 [basic.scope.class])

关于c++ - 为什么有些情况下可以省略模板参数规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67317240/

相关文章:

c++ - Cpp 中的构造函数和变量声明

c++ - 如何识别变量的类型

c++ - Qt 事件和信号/插槽

c++ - 计算数组中不同整数的数量

c++ - 声明模板结构的实例

C++ 默认、复制和提升构造函数

c++ - 寻找数组的最小值

c++ - 函数中推导参数之前的默认模板参数?

c++ - 如何避免重复

c++ - 编译器错误,因为构造函数必须显式初始化成员