【问题标题】:Proper Declaration of Classes Inherited from Template Class从模板类继承的类的正确声明
【发布时间】:2012-04-11 00:23:56
【问题描述】:

我对如何正确声明从模板类继承的类有点困惑。

基类看起来像这样(不包括不相关的位):

template <class Writer>
class Node
{
    Writer* writer;
    ...
public:
    Node (std::string& root);
...
}

声明和构造 this 的继承类的正确方法是什么? 我的想法是这样的:

template <class Writer>
class IndexNode : public Node
{...}

但是,这样做会给我“expected class-name before '{' token”。我尝试在继承类中注释掉模板声明,认为模板声明本身可能是从父类继承的,但这也没有帮助,也尝试过

class IndexNode : template <class Writer> public Node
{...}

,认为模板可能必须显式附加到基类。我认为与其继续尝试正确的组合,不如寻求帮助,并希望能学到一些能让我理解原因的东西。

谢谢!

【问题讨论】:

  • 附注:习惯上用一个大写字母编写模板参数(在您的情况下为Writer)。全名通常会混淆类是模板参数还是已知类。
  • 已注意到,并将进行更改。我刚刚开始使用模板。谢谢!
  • @Shahbaz:我完全不同意这个建议。通过将模板参数的名称限制为单个字母,您极大地混淆了您的代码:Writer 表明我正在处理的类型是一个作家; W 不表示任何内容。此外,说这是一种习惯做法是完全错误的(例如,参见标准算法模板参数的名称:它们清楚地表明了预期的迭代器类型)。如果你真的想表明一个名称表示一个模板参数,你可以使用 .Net 约定并在名称前加上 T
  • @LucTouraille 我这么说是因为我一直在阅读它。例如第 3.1.8 节中的here,它表明这是一种常见的做法。不过进一步搜索,似乎是it really depends

标签: c++ templates inheritance


【解决方案1】:

你的派生类也是模板吗?

是的:

template <class Writer>
class IndexNode : public Node<Writer>
{
   //...
}

否:

class IndexNode : public Node<SomeClassThatSpecializezNode>
{
   //...
}

【讨论】:

  • 是的;从模板类继承时,必须提供参数。
  • 感谢您的第二个选项!这对未来也有帮助。
【解决方案2】:

如下所示,您需要实例化正确的基类类型。

template<class Writer>
class IndexNode: public Node<Writer>
{
};

【讨论】:

    【解决方案3】:

    这取决于。如果您继承的类使用 SpecificWriter 类,您会这样做

    class IndexNode : public Node<SpecificWriter>
    {
    };
    

    如果你继承的类也应该被模板化,那么

    template <typename Writer>
    class IndexNode : public Node<Writer>
    {
    };
    

    【讨论】:

      【解决方案4】:

      template<class Writer>
      class IndexNode : public Node<Writer>
      

      如果Writer 应该是IndexNode 的模板参数。

      class IndexNode : public Node<Writer>
      

      如果Writer 是已知类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        相关资源
        最近更新 更多