Неопределенная ссылка на конструктор класса, когда он правильно определен?

У меня есть класс, определенный в заголовке и правильно реализованный (я думаю), и он правильно включен (я думаю) везде, где я пытаюсь его использовать.

Я думаю, что упускаю что-то в отношении некоторого базового синтаксиса, связанного с определением класса

Я прочитал почти каждый вопрос C ++ о «неопределенной ссылке на конструктор класса» в stackoverflow, но ни один из них, похоже, не подходит для моей ситуации.

#include "headers/init.h"
int main()
{

GameInstance *game = new GameInstance(60,480,480,"window");

}
#include "../headers/init.h"...
Shader vertex("../shaders/vertex.glsl", GL_VERTEX_SHADER);
...
#ifndef SHADER_H
#define SHADER_H

#include <string>
#include <iostream>
#include <GL/glew.h>
#include <GL/gl.h>

#include <fstream>
class Shader
{
std::string sh_contents;

std::ifstream sh_source;

GLenum sh_type;
GLuint sh_id;

public:
Shader(const char path[], GLenum p_type );
void compile(GLsizei p_count);

char* geterror();

};
#endif // SHADER_H
#include "../headers/shader.h"
Shader::Shader(const char path[], GLenum p_type)
{
sh_type = p_type;

sh_source.open(path);
if(sh_source.is_open())
{
sh_source >> sh_contents;
}
else
{
std::cout << "Shader error: couldn't read from file specified!";
}}

void Shader::compile(GLsizei p_count)
{
sh_id = glCreateShader(sh_type);
const char * buffer = sh_contents.c_str();
int length = sh_contents.length();
glShaderSource(sh_id, p_count, &buffer, &length);
glCompileShader(sh_id);

}
char* Shader::geterror()
{
if(glIsShader(sh_id))
{
GLint sh_status;
glGetShaderiv(sh_id,GL_COMPILE_STATUS, &sh_status);
if(sh_status == GL_FALSE)
{
GLint er_length;
glGetShaderiv(sh_id, GL_INFO_LOG_LENGTH,&er_length);
char* er_return;
glGetShaderInfoLog(sh_id, er_length, &er_length, er_return);
glDeleteShader(sh_id);
return er_return;

}
else
{
char* er_return = '\0';
return er_return;
}
}
}

Редактировать № 1:

Ошибка:

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

Редактировать № 2:

Я был в состоянии скомпилировать источник с gpp через терминал BASH, и он легко компилируется (примечание: я обновил код в соответствии с предложением многих ответчиков), так что, похоже, это проблема Code :: Blocks.

Это команда, которую я использовал для компиляции моей программы с помощью gpp: g++ main.cpp source/init.cpp source/shader.cpp -lSDL2 -lGLEW -lGL

Это мой файл CodeBlocksProject:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="engine" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/engine" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
<Linker>
<Add library="SDL2" />
<Add library="GLEW" />
<Add library="GL" />
</Linker>
</Target>
<Target title="Release">
<Option output="bin/Release/engine" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="headers/init.h" />
<Unit filename="headers/shader.h" />
<Unit filename="main.cpp" />
<Unit filename="shaders/fragment.glsl" />
<Unit filename="shaders/vertex.glsl" />
<Unit filename="source/init.cpp" />
<Unit filename="source/shader.cpp">
<Option target="&lt;{~None~}&gt;" />
</Unit>
<Extensions>
<code_completion />
<envvars />
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>

1

Решение

Вы объявили конструктор как

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,

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector