在自身内部创建模板类的 std 容器

Posted

技术标签:

【中文标题】在自身内部创建模板类的 std 容器【英文标题】:create a std container of template class within itself 【发布时间】:2016-06-05 19:04:24 【问题描述】:

我有以下类模板的继承层次结构:

#include <string>
#include <unordered_map>

// Basic class template
template <class T>
class Data

public:
  ~Data();
  Data();

protected:
  T data;
;

// Works with no problems
class String : public Data <std::string>


;

// Works with no problems
class Float : public Data <float>


;

// Compilation error
class Object : public Data < std::unordered_map < std::string, Data < Object > > >


;

我正在尝试为我当前定义的类创建一个标准容器。这可能吗?如果这不是一个类模板,我可以做一个前向声明,但是既然它是一个模板,这有可能吗?

【问题讨论】:

"Problem :(" 不是一个有效的问题,也不是一个实际的问题描述。P.S. 修复你的赋值运算符。在许多用例中,它会导致未定义的行为。 Object 不是模板。 它实际上是用clang编译的:melpon.org/wandbox/permlink/BfBEnLjY16Oa6EZ5 g++: try.cc:13:5: error: ‘Data&lt;T&gt;::data’ has incomplete type 因为它认为 Object 在这一点上是不完整的。 好吧,其实问题出在Data上,见***.com/a/3823464/2004616 【参考方案1】:

对于std::unordered_map &lt; std::string, Data &lt; Object &gt; &gt; Object 是一个不完整的类型

您可以改用指向Object 的指针:

class Object : public Data <   std::unordered_map < std::string, Object* >>


;

【讨论】:

以上是关于在自身内部创建模板类的 std 容器的主要内容,如果未能解决你的问题,请参考以下文章

如何组合切片,模板和非派生类?

使用外部类的模板参数设置内部模板类的默认模板参数

模板类的树,其中 chilldren 是 std::array of std::unique_ptr

ATL 容器的包装器,以便它们可以与 std:: 容器模板一起使用?

如何将 std::unordered_map 部分专门化为我的模板类的成员?

派生类的模板类作为函数的参数 - 危险?