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

时间:2018-02-11 19:45:40

标签: c++

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

    #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);

为什么会出现此错误,以及编写此代码的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

更改您的函数声明以正确定位std::vector

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

如果没有解决问题,则错误大约为Shape。您需要确保在函数LoadModel的定义中,如果该函数需要访问其任何数据成员,则编译器具有类Shape的完整定义。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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