- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我收到以下错误:'ComponentManager' does not refer to a value
编译从该父类继承的子类时:
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::vector
与 n_v
空 std::deque
s 在构造函数中。
子类声明了一个类似的vector
的 deque
s 并按预期编译/工作(直到我将 vector<deque>
添加到父级,即):
template<typename ComponentManager>
class test_component_collection : public component_collection<ComponentManager> {
std::vector<std::deque<int>> values;
public:
test_component_collection(int n_c, int n_v) :
component_collection<ComponentManager>(n_c, n_v),
values(n_v, std::deque<int>()) // <-- NO ERROR HERE
{ }
...
};
所以这似乎与它是 std::shared_ptr<entity<ComponentManager>>
的容器有关,但我不明白为什么这会成为问题(包含 entity
header ,如您所料采用 <ComponentManager>
,并在使用所有这些类时提供 ComponentManager
)。
我显然遗漏了一些东西......
更新
这是 entity
的代码:
template<typename ComponentManager>
class entity {
protected:
ComponentManager & component_manager;
public:
entity(ComponentManager & cm) : component_manager(cm) {}
void initialise_components(shared_ptr<entity<ComponentManager>> sp) {}
};
将此添加到 component_collection
的顶部似乎可以解决问题(至少是编译错误,我还没有彻底测试结果):
template<typename ComponentManager> using entity_ptr_deque = std::deque<shared_ptr<entity<ComponentManager>>>;
然后代入entity_ptr_deque<ComponentManager
在酌情。这有助于提高可读性,所以我可能会保留它,但它无助于理解错误,尤其是作为一个最小的示例构建良好(见评论)。
更新 2
使用 Wandbox从评论中,我发现我的完整类(class)没有编译,而@VittorioRomeo 编辑的版本编译了。
在 Wandbox 上从 Clang 切换到 GCC(我在本地使用 Clang)给出了截然不同的错误消息:
declaration of 'auto component_collection<ComponentManager>::entity(int)'
changes meaning of 'entity'
这是在我添加 std::vector<std::deque<shared_ptr<entity<ComponentManager>>>> entity_pointers;
之前存在的方法和相关的构造函数更新。它当然掩盖了名字 entity
在类定义中,因此出现错误。 Clang 的错误消息完全指向其他地方。
最佳答案
Clang 编译错误 'X' does not refer to a value
可能会产生误导。
这意味着,在代码的那一点,Clang 需要一个值,而不是一个类型。但其原因可能与 X
的性质无关。 .
可能是什么X
正在传递给 需要一个值而不是类型,即 Clang 不认为这是一个模板。
特别是在这种情况下:template<typename ComponentManager> entity
已被类中的方法屏蔽 - auto entity(int)
.这改变了 entity
的含义,在模板专门化的位置导致错误,但不在执行屏蔽的方法的位置。
GCC 在这种情况下给出了更清晰的错误消息,因此值得尝试像 Wandbox 这样的工具看看不同的编译器认为代码有什么问题。
关于c++ - 模板编译错误: 'X' does not refer to a value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41222330/
我是一名优秀的程序员,十分优秀!