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'