我有一个包含OpenGL内容的程序,例如窗口,程序等。
我希望我在主文件中使用的Window和Program类的实例对于主文件是全局的,我一直在使用Window这样做
//Outside main()
Window window
(
"test", //title
1366, //width
768, //height
);
然后我可以在主文件的其余部分使用此实例,例如。
//Within main()
window.create();
window.refresh();
等
现在,当我尝试制作程序的全局实例时,我会这样做:
//Just below Window, still outside main()
Program program(); //No arguments for the constructor for Program
然后当我尝试在我的主函数中使用它时:
program.addShader(GL_VERTEX_SHADER, "vertex_shader_source.glsl");
我收到错误:
request for member 'addShader' in 'program', which is of non-class type 'Program()'
看了这个,看起来编译器认为我在main()之前初始化实例是一个函数,所以它认为我试图在一个显然不起作用的函数上调用方法。
我只是无法弄清楚如何以对Window的方式来完成这项工作,我可以告诉的关键区别可能意味着Window工作而程序不是:
答案 0 :(得分:2)
您已经发现了所谓的most vexing parse。
确实,当你这样做时:
Program program();
它含糊不清,因为你可以做两件事:
program
program
的函数,它返回Program
并且不带参数C ++标准规定编译器在遇到此代码时会选择第二种可能性。
要避免此问题,请删除parens
//Declares and defines a new program variable by invoking the default ctor
Program program;
答案 1 :(得分:0)
使用
Program program;
而不是
Program program();
如果没有参数,您不需要使用parens作为构造函数。实际上,第二个构造被解释为函数声明(函数没有参数返回Program
)。
答案 2 :(得分:0)
不要这样写:
Program program();
因为解析器认为你刚刚声明了一个名为" program"没有参数,返回Program实例。
这是使用默认构造函数定义对象的正确方法:
Program program;