【问题标题】:C++ -- candidate expects 1 argument, 0 on class definitionC++ -- 候选人期望 1 个参数,0 类定义
【发布时间】:2016-01-16 05:02:03
【问题描述】:

我使用 c++ 和 opengl 有一段时间了,但从来没有真正沉迷于课堂。我正在尝试为我的体素游戏创建一个 Block 类,但是编译器给了我错误

block.h:13:7: note: candidate expects 1 argument, 0 provided

第 13 行是创建类的行。这是块头文件:

#ifndef BLOCK_H
#define BLOCK_H

#include <GL/glew.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "Shader.h"
#include "Camera.h"

using namespace glm;

class Block{
public:
    void render(Camera cam);
    glm::vec3 position;
    Block(glm::vec3 position);  
private:
    void createMesh();
    GLuint VAO, VBO;
    Shader shader;
};

#endif

完整的错误:

world.cpp: In constructor ‘World::World(GLFWwindow*)’:
world.cpp:3:32: error: no matching function for call to ‘Block::Block()’
 World::World(GLFWwindow* window)
                                ^
world.cpp:3:32: note: candidates are:
In file included from world.h:9:0,
                 from world.cpp:1:
block.h:17:2: note: Block::Block(glm::vec3)
  Block(glm::vec3 position); 
  ^
block.h:17:2: note:   candidate expects 1 argument, 0 provided
block.h:13:7: note: Block::Block(const Block&)
 class Block{
       ^
block.h:13:7: note:   candidate expects 1 argument, 0 provided

我还收到许多其他类似的编译器错误,输出如下:
http://pastie.org/10691691

---编辑--- 好的,我已经将错误缩短了一点。 这是更新的错误日志:http://pastie.org/10691707

【问题讨论】:

  • 您还应该附加调用代码/标头(shader.h 等)。从错误看来,您的构造函数签名与您在代码中创建它的方式不匹配。也许您可以看到以下内容:-stackoverflow.com/questions/12733888/…

标签: c++ class object


【解决方案1】:

我看到一个错误,说 Shader 没有默认构造函数,即Shader::Shader()。对于该错误,您的 Block 类的构造函数将需要在成员初始化器列表中构造它。

例如

Block::Block(glm::vec3 position)
:  m_Shader( "needed shader args" )
{
}

看起来你正试图在世界级的某个地方构建你的 Blocks 之一?它也抱怨缺少 Block 的默认构造函数。如果你想要默认构造函数,你必须在你的块类定义中定义一个。或者你需要在 World 类的成员初始化器列表中初始化你的块类,就像上面的着色器示例一样。

正如编译器所建议的,您也可以在类成员初始化程序中使用,但您需要为此启用 C++11 支持。

【讨论】:

  • 很遗憾,我不懂OpenGL,所以无法提供超级具体的方向。但似乎您有两个着色器构造函数选项,一个采用顶点路径和片段路径或复制构造函数。如果您知道 vertexPath 和 fragmentPath 是什么,或者您可以访问要使用的着色器,则需要修改 Block 构造函数的定义以传递它们来代替我在上面键入的“需要的着色器参数”。跨度>
  • 另外,您可能需要查看cplusplus.com/doc/tutorial/classes 尤其是关于成员初始化器列表的部分。
【解决方案2】:

您对Block 的定义需要在其构造期间传递glm::vec3 的参数(或Block 本身用于复制构造)。 World 的构造函数似乎没有提供这样的参数。

【讨论】:

    【解决方案3】:

    原来我还必须在每个类中放置一个空的覆盖构造函数。问题是我在创建变量以及实例化对象时调用了构造函数。这是一个简单的例子:

    Shader::Shader(){
        //Do nothing here is it just a override so we declare the variable before creating it.
    }
    
    Shader::Shader(char* vpath, char* fpath){
        //Do proper shader stuff here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 2020-07-11
      • 2012-02-11
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多