C ++ - 候选者期望1个参数,0在类定义上

时间:2016-01-16 05:02:03

标签: c++ class object

我已经使用了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

--- --- EDIT 好的,我把错误缩短了一点。 以下是更新的错误日志:http://pastie.org/10691707

3 个答案:

答案 0 :(得分:1)

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

例如

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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

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
}