引用指针是非法的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用指针是非法的相关的知识,希望对你有一定的参考价值。
我最近一直在进行模板元编程,只是意识到模板调试的难度。例如,当我尝试编译以下代码时,我收到“指向引用的指针是非法的”错误:
#include <vector>
#include <tuple>
//Empty Entity Class
class Entity {
};
#define COMPONENTS X(Entity)
#define COMPONENTSLIST X(Entity)
#define X(ARG) std::vector<ARG>
using ComponentTuple = std::tuple<COMPONENTSLIST>;
#undef X
//EntityManager stuff
class EntityManager {
static ComponentTuple components;
public:
template<class T>
static auto& Components();
template<class T>
static void AddComponent(Entity&, T&&);
};
template<class T>
auto& EntityManager::Components()
{
return std::get<std::vector<T>>(components);
}
template<class T>
void EntityManager::AddComponent(Entity& e, T&& c) {
auto& comp = Components<T>();;
comp.push_back(c);
}
#define X(ARG) std::vector<ARG>
std::tuple<COMPONENTSLIST> EntityManager::components;
#undef X
//ContentManager Stuff
class ContentManager {
bool LoadComponent(std::string data, Entity& entity);
template <class T>
static void LoadComponent(std::string data, Entity& entity);
};
template <class T>
void ContentManager::LoadComponent(std::string data, Entity& entity) {
T component{};
EntityManager::AddComponent(entity, component);
}
bool ContentManager::LoadComponent(std::string data, Entity& entity) {
LoadComponent<Entity>(data, entity);
}
错误的原因是EntityManager::AddComponent(entity, component);
中的行LoadComponent
(考虑到xmemory
的错误点,这不容易弄清楚)。
我遇到的问题是我从未请求指针,据我所知,所以这个错误对我来说似乎很奇怪。
此时,将非常感谢任何帮助(与错误或甚至未来模板调试的提示有关)。提前致谢。
答案
将AddComponent
的语法更改为:
static void AddComponent(Entity&, T);
要么
static void AddComponent(Entity&, const T&);
并且你的代码至少用gcc编译。所以这并不一定与你的模板有关,而是用push_back
处理右值引用的方式。
以上是关于引用指针是非法的的主要内容,如果未能解决你的问题,请参考以下文章
使用 Kotlin 在片段中引用 RecyclerView 时出现空指针错误