未定义的类构造函数引用,当它被正确定义时

Undefined refrence to class constructor, when it is properly defined?

本文关键字:定义 构造函数 引用 未定义      更新时间:2023-10-16

我有一个类定义在头和正确实现(我认为),这是正确包含(我认为)无论我试图使用它。

我想我遗漏了一些关于类定义的基本语法。

我已经阅读了几乎每一个c++"未定义的引用类构造器"的问题在stackoverflow上,但他们似乎都不适用我的情况。

<标题> main.cpp h1> init.cpp h1> shader.h h1> shader.cpp h1>

错误:

/home/dok/SDL2/ngin/engine/source/init.cpp|71|undefined reference to `Shader::Shader(char*, unsigned int)'|
编辑# 2:

我能够通过BASH终端使用gpp编译源代码,并且它毫不费力地编译(注意:我已经根据许多回答者的建议更新了代码),所以这似乎是一个code::Blocks问题。

这是我用来用gpp编译程序的命令:g++ main.cpp source/init.cpp source/shader.cpp -lSDL2 -lGLEW -lGL

这是我的CodeBlocksProject文件: <标题> ngin.cpb h1> div class="answers">

您将构造函数声明为

Shader(char* path, GLenum p_type);

虽然错误信息显示您正在使用声明为

的构造函数
Shader(char*, unsigned int);

即第二个参数不重合,没有从unsigned int类型到GLenum类型的隐式转换。

我不知道GLenum类型是如何定义的,但是您可以尝试以以下方式调用构造函数

Shader vertex("../shaders/vertex.glsl", static_cast<GLenum>( GL_VERTEX_SHADER) );

使用从类型unsigned int到类型GLenum的显式转换

也要考虑使用字符串字面值作为第一个参数。类型为const char []。所以它不能被用作论点。您应该将第一个参数声明为const char *

还有头文件的递归包含。标题shader.h包含init.h, init.h包含shader.h