奇怪的重复模板模式非静态成员函数的非法调用

时间:2018-02-23 10:25:06

标签: c++ templates static c++14 crtp

我最近尝试过很多模板元编程,尤其是使用CRTP,并且遇到了名义错误。特别是错误C2352' MeshComponent :: InternalSetEntity&#39 ;:非法调用非静态成员函数。

我的代码的最小,完整和可验证的信息是这样的:

Component.h

class Entity //Forward declaration

template<class T, EventType... events>
class Component {
private:
    short entityID;
public:
    void SetEntity(Entity& _entity) { entityID = _entity.GetId(); T::InternalSetEntity(_entity); }
protected:  
    void InternalSetEntity(Entity& _entity) {}
};

MeshComponent.h

#include "Component.h"
class MeshComponent : public Component<MeshComponent> {
    friend class Component<MeshComponent>;
protected:
    void InternalSetEntity(Entity& _entity);
};

MeshComponent.cpp

#include "MeshComponent.h"
void MeshComponent::InternalSetEntity(Entity& _entity) {
    //Nothing yet
}

Entity.h

class Entity {
private:
    short id;
public:
    short GetId() {return id;}
};

我没有宣布任何静态功能,也不是我想要的。事实上,我要求它们是成员函数,因为它们将对特定于实例的数据进行操作。

如果有人知道为什么会发生此错误并且可能解决问题,我将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您知道并确保MeshComponent继承自Component<MeshComponent>,但编译器并不知道:就Component的定义所知,Component<T>T无关。您需要明确执行向下转发:

static_cast<T*>(this)->InternalSetEntity(_entity);