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