首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪地重复出现模板模式非法调用非静态成员函数

奇怪地重复出现模板模式非法调用非静态成员函数
EN

Stack Overflow用户
提问于 2018-02-23 18:25:06
回答 1查看 142关注 0票数 0

我最近尝试了很多模板元编程,特别是使用CRTP,遇到了标题错误。具体错误C2352 'MeshComponent::InternalSetEntity':非法调用非静态成员函数。

我的代码中最小的、完整的和可验证的代码片段如下:

Component.h

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#include "Component.h"
class MeshComponent : public Component<MeshComponent> {
    friend class Component<MeshComponent>;
protected:
    void InternalSetEntity(Entity& _entity);
};

MeshComponent.cpp

代码语言:javascript
运行
复制
#include "MeshComponent.h"
void MeshComponent::InternalSetEntity(Entity& _entity) {
    //Nothing yet
}

Entity.h

代码语言:javascript
运行
复制
class Entity {
private:
    short id;
public:
    short GetId() {return id;}
};

我没有声明任何静态函数,我也不想这样做。事实上,我要求这些函数是成员函数,因为它们将对特定于实例的数据进行操作。

如果有人知道这个错误发生的原因以及问题的可能解决方案,我将不胜感激。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-23 18:29:03

您知道并确保MeshComponent继承自Component<MeshComponent>,但编译器并不知道这一点:据它所知,在Component的定义中,Component<T>T是无关的。您需要显式地执行向下转换:

代码语言:javascript
运行
复制
static_cast<T*>(this)->InternalSetEntity(_entity);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48945671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档