gpt4 book ai didi

c++ - 模板编译错误: 'X' does not refer to a value

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:47 24 4
gpt4 key购买 nike

我收到以下错误:'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::vectorn_vstd::deque s 在构造函数中。

子类声明了一个类似的vectordeque 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com