static class EntranceClass {
public:
static void RegisterSomething()
{
}
static int main()
{
RegisterSomething();
return 0;
}
} // <-expected unqualified-id at end
我收到以下错误: 输入main.cpp末尾的预期非限定id问题
有没有解决方案
答案 0 :(得分:21)
main
只是main
!功能:
class EntranceClass
{
...
}; //<-- note the semicolon
int main()
{
}
答案 1 :(得分:9)
根据标准,您没有编写真正的main
函数。
第3.6.1节第3段:“函数main
不得在程序中使用(3.2)。main
的链接(3.5)是实现定义的。一个声明的程序main
inline
或static
格式不正确。名称main
未另外保留。[示例:成员函数,类,和枚举可以称为main
,其他名称空间中的实体也可以。{“
这意味着,通过声明成员函数main
,您只需声明成员函数。它没有特别的意义,并不意味着课堂上的任何东西都可以独立调用。如果用snicklefrazz
替换该函数名和所有引用,该程序将完全相同。
在风格上,snicklefrazz
会更好,因为它不会导致标准main
函数得出任何可能的结论。
第3.6.1节第1段:“程序应包含一个名为main
的全局函数,它是程序的指定开始。它是实现定义的,是否需要在独立环境中的程序定义一个main
函数。“
这意味着,除非您正在编写标准称为独立环境(通常用于编写嵌入式系统)的内容,否则您需要定义main
全局函数,这是程序启动的地方。
在Java中,类可以有main
方法,这是程序在调用类时开始的位置。在C ++中并非如此,并且无法直接实现此目的。
(并且,正如其他人所提到的,class
不能是static
,而类定义以分号结尾。)
答案 2 :(得分:8)
错误是指在类定义之前使用static
关键字 - 编译器在此之后需要一个变量名(因为在C ++中没有static class
之类的东西)。
如果你想使用static int EntranceMain::main(void)
作为你的程序的入口点,那么一种方法是告诉你的链接器,即给它一个完整的装饰名称。这在很大程度上取决于您使用的编译器和链接器,因此您需要参考其文档。但使用它可能意味着您需要包含启动代码(例如CRT初始化)。
请注意,这不符合标准。
答案 3 :(得分:7)
在右括号后你可能忘记了分号吗?
答案 4 :(得分:1)
您正在寻找Constructor
对象?:)
无论如何请尝试删除static
...
答案 5 :(得分:1)
这对我来说似乎是一种糟糕的编码风格,可以将你的主要内容放到课堂上,但如果你真的想这样做,我认为实现更像是这样:
class Foo{
public:
int main(){ return 0; };
};
Foo bar;
int Foo::main(){
bar.main();
}
正如我所说,这似乎是非常糟糕的编码风格。你最好在.hpp文件中构建你的类,然后将它链接到你的program_main.cpp(通过#include“foo.hpp”),它有int main(){return 0;函数让你调用类。
答案 6 :(得分:1)
在C ++中,你可以拥有“全局”功能,i。即不是任何类的成员(Java语言中的“方法”)的函数。
默认情况下,C ++程序的入口点是“全局”main()
函数,通常如下所示:
int main(int argc, char *argv[])
{
// do stuff
}
main()
的参数允许程序获取命令行参数。它们可以像这样省略
int main()
{
// do stuff
}
在这种情况下,您的程序不会带任何参数。当程序正常退出时,约定是main()
返回0.除0之外的返回值通常用于表示错误。
C ++中没有静态类的概念。您可以拥有静态成员函数和数据成员,或静态全局变量(从C继承的静态的不同含义)。
在课程定义后你需要一个分号。
答案 7 :(得分:-1)
您可以做的一个技巧是创建一个类似于“BaseApp”的类,该类派生自,然后实现一个调用真实版本的虚函数。
class BaseApp
{
public:
virtual void EntryPoint() = 0;
static BaseApp* GetApp() { return this; }
};
然后只需从中派生一个类,实现一个EntryPoint(),然后定义你的对象。
class SpecializedApp: public BaseApp
{
public:
void EntryPoint() { ... }
};
SpecializedApp g_App;
然后,你有main()调用它:
void main()
{
BaseApp::GetApp()->EntryPoint();
}
这种方法可以使main成为一种通用启动例程,可以根据事物的链接方式调用不同的入口点。您可以在BaseApp之上安装Win32类或标准C类。