引用指针是非法的

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 时出现空指针错误

C中的棘手指针算法:** k

MFC GetEditCtrl 报错非静态成员函数的非法调用

关于Segmentation fault错误

编译器开发系列--Ocelot语言5.表达式的有效性检查

智能指针的应用