C++ 模板编译错误:';X';不引用值

C++ 模板编译错误:';X';不引用值,c++,c++11,templates,c++14,C++,C++11,Templates,C++14,我收到以下错误:“ComponentManager”在编译从父类继承的子类时未引用值: template<typename ComponentManager> class component_collection { protected: int n_components; int n_versions; int first_blank; int last_used; std::vector<std::deque<shared_ptr<entit

我收到以下错误:
“ComponentManager”在编译从父类继承的子类时未引用值

template<typename ComponentManager>
class component_collection {
protected:
  int n_components;
  int n_versions;
  int first_blank;
  int last_used;
  std::vector<std::deque<shared_ptr<entity<ComponentManager>>>> entity_pointers;

public:
  component_collection(int n_c, int n_v) :
    n_components(n_c),
    n_versions(n_v),
    first_blank(0),
    last_used(0),
    entity_pointers(n_v, std::deque<shared_ptr<entity<ComponentManager>>>()) // <-- ERROR HERE
  {}

  ...

};
因此,这似乎与作为
std::shared_ptr
的容器有关,但我不明白为什么这会是一个问题(包括
实体
标题,按照您的预期使用
,并且在使用所有这些类时提供
组件管理器

我显然错过了一些东西

更新

以下是
实体
的代码:

template<typename ComponentManager>
class entity {
protected:
  ComponentManager & component_manager;

public:
  entity(ComponentManager & cm) : component_manager(cm) {}
  void initialise_components(shared_ptr<entity<ComponentManager>> sp) {}
};

然后替换
entity\u ptr\u deque,则铿锵编译错误
'X'未引用值
可能会产生误导

这意味着,在代码的这一点上,Clang期望的是一个值,而不是一个类型。但原因可能与
X
的性质无关

可能是传递给的任何
X
都需要一个值而不是一个类型,即Clang不认为这是一个模板

特别是在这种情况下:
模板实体
已被类–
自动实体(int)
中的方法屏蔽。这改变了
实体的含义
,在模板专业化的站点上导致错误,但在进行掩蔽的方法的站点上没有


GCC在这个例子中给出了更清晰的错误信息,因此值得尝试一种工具,比如看看不同的编译器认为代码有什么问题。

无法复制尝试初始化
仅使用
值(n\u v)
。填充元素的默认初始化是默认值。不是答案,但可能会让你更深入地了解正在发生的事情。你能发布
实体
模板的声明或你包含的标题吗?我已经添加了
实体
。我并不完全惊讶于这个最小的示例构建是好的——我不明白为什么它不好!你还想去哪里看看?除了删除一些成员函数之外,我根本没有编辑粘贴的代码,但我不知道它们会如何影响这一点
template<typename ComponentManager>
class entity {
protected:
  ComponentManager & component_manager;

public:
  entity(ComponentManager & cm) : component_manager(cm) {}
  void initialise_components(shared_ptr<entity<ComponentManager>> sp) {}
};
template<typename ComponentManager> using entity_ptr_deque = std::deque<shared_ptr<entity<ComponentManager>>>;
declaration of 'auto component_collection<ComponentManager>::entity(int)' 
changes meaning of 'entity'