我可以实例化一个模板化对象A <b>,其中包含A <b>类型的对象的双端队列?

时间:2016-04-26 13:22:36

标签: c++ llvm

我想了解以下代码是否正确,或者不是:

Broadcast

此代码使用多个工具链编译而不会产生错误(例如,请参阅here)。 问题是现在我得到一个实例化错误(可能与我使用llvm libc ++,不确定版本有关)。

GraphShape

如果这段代码是正确的,我不想调查bug的来源(编译器或std库实现)或者有一个解决方法:再次,我主要想了解上面的代码是否正式正确。

2 个答案:

答案 0 :(得分:16)

代码格式不正确。此时:

template<class T>
struct Node {
    std::deque<Node<T> > branches; // <==

Node<T>仍然是一个不完整的类型。目前有三个容器的不完整类型的内置异常:

  • “如果分配器满足分配器,则在实例化T时可以使用不完整类型forward_list 完整性要求17.6.3.5.1。 T之前应在完成专业化的任何成员之前完成 引用了forward_list。“[forwardlist.overview]/4
  • “如果分配器满足分配器完整性,则在实例化T时可以使用不完整类型list 要求17.6.3.5.1。在T所得专业化的任何成员之前,list应完成 引用。“[list.overview]/3
  • “如果分配器满足分配器完整性,则在实例化T时可以使用不完整类型vector 要求17.6.3.5.1。 T在完成专业化的任何成员之前应完成 引用了vector。“[vector.overview]/3

deque没有这样的措辞,目前需要一个完整的类型。似乎与我不一致,允许vector但不是deque的不完整类型,但这就是它的方式。

答案 1 :(得分:2)

它不是编译器中的错误,也不是标准库中的错误。该计划形成不良。您可能无法使用不完整的值类型实例化std::deque