【问题标题】:error when declaring an inner class template field声明内部类模板字段时出错
【发布时间】:2022-01-01 08:51:04
【问题描述】:

以下代码使用内部模板类 Node.js 时出现错误。 错误是在声明根私有字段时:

“成员 root 声明为模板”。

template <typename KeyType, typename ValueType>
class TreapBST : public AbstractBST<KeyType, ValueType>
{
public:
    .....

private:
   template <typename K, typename V>
   struct Node
   {
       ....
   };

    template <typename K, typename V>
    typename TreapBST<K, V>::Node<K, V>* root = nullptr;

};

【问题讨论】:

  • template ... root 应该是什么意思?你将如何指定它的模板参数?或者编译器应该如何推断它们?
  • 它应该是指向 Treap (BST + Heap) 根的指针
  • 您不能有模板字段或字段模板。幸运的是,在这种情况下你不需要任何东西。你想要Node * root = nullptr;struct Node 也不应该是模板。
  • 我在这里删除了副本。除了在正确的位置简单地添加 template 之外,还有其他东西。
  • 在什么情况下不起作用? Node 将是一个模板,因为它是类模板的私有类。当你编写一个类模板时,你不需要不断重复template &lt;typename K, typename V&gt;,除非你希望 K 和 V 是 两个不同的类型而不是类参数 KeyType 和 ValueType

标签: c++ c++11


【解决方案1】:

我认为您的基本想法是正确的,但语法混乱。

当您编写类模板时,您不需要为每个成员重复template &lt;typename K, typename V&gt;,除非您希望KV 是不同于类参数KeyTypeValueType 的两种类型.如果您只需要KeyTypeValueType,则无需将成员重新声明为模板。

例如以下将编译:

template <typename KeyType, typename ValueType>
class AbstractBST
{
    //...
};

template <typename KeyType, typename ValueType>
class TreapBST : public AbstractBST<KeyType, ValueType>
{
public:
    //...

private:

    struct Node
    {
        KeyType key;
        ValueType val;
        //...
    };

    Node* root = nullptr;

};

int main()
{
    TreapBST<std::string, int> treap;
    return 0;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2018-07-05
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多