You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:49:33