C++封装GLFW/GLEW初始化类时遇构造函数重载歧义编译错误求助
C++封装GLFW/GLEW初始化类时遇构造函数重载歧义编译错误求助
嗨,我最近在写C++代码封装GLFW和GLEW的初始化逻辑,搞了个Init类把窗口创建、着色器编译链接这些初始化步骤都封装进去,结果在main函数里创建类对象的时候栽了跟头,编译器报了个cannot determine which instance of overloaded function "Init::Init" is intended的错误,折腾半天没搞明白问题出在哪,来求助大家!
先贴一下我的代码片段:
Init.h
class Init { public: Init(GLuint width, GLuint height, GLchar* vertexShaderSource, GLchar* fragmentShaderSource); void run(); void setHeight(GLuint height); void setWidth(GLuint width); GLuint getHeight(); GLuint getWidth(); GLFWwindow* getWindow(){return this->fwindow;} void createWindow(); void setKeyCallback(GLFWwindow* window); void setViewportSettings(); int setVertexShaderSettings(); int setFragmentShaderSettings(); int glLinkShaders(); private: GLuint fwidth; GLuint fheight; GLFWwindow* fwindow; GLuint fvertexShader; GLuint ffragmentShader; GLuint shaderProgram; GLchar* fvertexShaderSource; GLchar* ffragmentShaderSource; GLint fsuccess; GLchar finfoLog[512]; }; void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
Init.cpp
#include "../src/Init.h" #include "../include/GL/glew.h" #include "../include/GLFW/glfw3.h" #include <iostream> Init::Init(GLuint width, GLuint height, GLchar* vertexShaderSource, GLchar* fragmentShaderSource){ this->fwidth = width; this->fheight = height; this->fvertexShaderSource = vertexShaderSource; this->ffragmentShaderSource = fragmentShaderSource; } void Init::run(){ glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); } void Init::setHeight(GLuint height){ this->fheight = height; } void Init::setWidth(GLuint width){ this->fwidth = width; } GLuint Init::getHeight(){return this->fheight;} GLuint Init::getWidth(){return this->fwidth;} void Init::createWindow(){ this->fwindow = glfwCreateWindow(this->fwidth, this->fheight, "Ayite's UI Thingy", nullptr, nullptr); glfwMakeContextCurrent(this->getWindow()); } void Init::setKeyCallback(GLFWwindow* window){ glfwSetKeyCallback(window, key_callback); } void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); } void Init::setViewportSettings(){ int width, height; glfwGetFramebufferSize(this->getWindow(), &width, &height); glViewport(0, 0, width, height); } int Init::setVertexShaderSettings(){ this->fvertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(this->fvertexShader, 1, &this->fvertexShaderSource, NULL); glCompileShader(this->fvertexShader); glGetShaderiv(this->fvertexShader, GL_COMPILE_STATUS, &this->fsuccess); if (!this>fsuccess) { // 这里有个小错误,后面会提 glGetShaderInfoLog(this->fvertexShader, 512, NULL, this->finfoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << this->finfoLog << std::endl; return -1; } return 0; } int Init::setFragmentShaderSettings(){ this->ffragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(this->ffragmentShader, 1, &this->ffragmentShaderSource, NULL); glCompileShader(this->ffragmentShader); glGetShaderiv(this->ffragmentShader, GL_COMPILE_STATUS, &this->fsuccess); if (!this->fsuccess) { glGetShaderInfoLog(this->ffragmentShader, 512, NULL, this->finfoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << this->finfoLog << std::endl; return -1; } return 0; } int Init::glLinkShaders(){ this->shaderProgram = glCreateProgram(); glAttachShader(this->shaderProgram, this->fvertexShader); glAttachShader(this->shaderProgram, this->ffragmentShader); glLinkProgram(this->shaderProgram); glGetProgramiv(this->shaderProgram, GL_LINK_STATUS, &this->fsuccess); if (!this->fsuccess) { glGetProgramInfoLog(this->shaderProgram, 512, NULL, this->finfoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << this->finfoLog << std::endl; return -1; } glDeleteShader(this->fvertexShader); glDeleteShader(this->ffragmentShader); return 0; }
main.cpp里的错误行
// 触发报错的代码 Init::Init init(WIDTH, HEIGHT, vertexShaderSource, fragmentShaderSource);
错误原因分析
仔细看你main里的对象声明代码:Init::Init init(...),这写法完全错了!你想创建Init类的实例,直接写Init init(参数列表)就够了,Init::Init是构造函数的限定名称,你这么写会让编译器误以为你在声明一个函数——函数名叫init,返回类型是Init::Init,但构造函数本身是没有返回值的,编译器瞬间就懵了,不知道你到底是要创建对象还是声明函数,所以就抛出了“无法确定要调用哪个重载构造函数”的歧义错误。
解决方法
把main里的对象声明代码改成下面这样,去掉多余的Init:::
Init init(WIDTH, HEIGHT, vertexShaderSource, fragmentShaderSource);
另外还要提个小细节:你在Init.cpp的setVertexShaderSettings方法里,有一行if (!this>fsuccess),这里少了个箭头,应该写成if (!this->fsuccess),这个小bug会导致编译或者运行时出错,记得一起修正哦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

