将类作为函数参数传递时C++不完整的类型错误

C++ incomplete type error when passing class as function parameter

本文关键字:错误 类型 C++ 函数 参数传递      更新时间:2023-10-16

我正在尝试在头文件中使用以下代码来定义一个类和一个函数,该函数将指向该类的指针向量作为参数。但是,在编译时,我收到一个不完整的类型错误。

#ifndef OBJECTS_H
#define OBJECTS_H
#include <glm/glm.hpp>
#include <vector>
struct Shape {
glm::vec3 emission;
float shininess;
glm::vec3 Ka;
glm::vec3 Ks;
glm::vec3 Kd;
Shape(glm::vec3 emission, float shininess, glm::vec3 Ka, glm::vec3 Ks, glm::vec3 Kd);
float intersects(const glm::vec4 start, const glm::vec4 direction);
virtual glm::vec4 randomPoint();
virtual glm::vec4 getNormal(const glm::vec4 &p);
virtual bool isLight();
};
void LoadModel(vector<Shape *> &scene, const char *path);
#endif

给出错误:

error: incomplete type is not allowed
void LoadModel(vector<Shape *> &scene, const char *path);

为什么会发生此错误,编写此代码的正确方法是什么?

与所有其他标准库容器一样,向量位于std命名空间中。因此,您应该将其称为std::vector,因为您没有行using namespace std;

更改函数声明以正确限定std::vector

void LoadModel(std::vector<Shape *> &scene, const char *path);

如果这不能解决它,那么错误是关于Shape.您需要确保在函数的定义LoadModel编译器具有类Shape的完整定义,如果该函数需要访问其任何数据成员。

当我遇到这些看似晦涩难懂的错误时,我会尝试消除代码的几个附加版本中的复杂性。

在这种情况下,我会在有问题的函数声明之前创建一些额外的函数声明:

LoadShape(Shape, const char*); LoadShape(vector<char>, const char*);

这将为vector<char>参数显示相同的错误,从而提供线索......显然char不会是一个不完整的类型,所以问题出在vector上,一般来说,我在使用 STL 类型时的错误与命名空间问题或与模板相关的 voodoo 有关。