我有这个标题:
#include <string>
#include <iostream>
using namespace std;
enum _TYPE {_FUNCTION,_SYMBOL};
class consoleApi
{
public:
void _consoleWrite(string arg1)
{
cout << arg1;
}
};
consoleApi _consoleApi;
class dataKeyword
{
public:
string _name;
_TYPE _type;
int _argumets;
void (*_pointer)(string);
};
dataKeyword _dataKeyword[128];
_dataKeyword[0]._name="consoleWrite";
_dataKeyword[0]._type=_FUNCTION;
_dataKeyword[0]._argumets=1;
_dataKeyword[0]._pointer=&_consoleApi._consoleWrite;
当我尝试编译它时,CodeBlocks抛出这些错误:
错误:'_ dataKeyword'没有命名类型|
错误:'_ dataKeyword'没有命名类型|
......等等。
我知道它通常意味着什么,但不是在这种情况下。怎么了?
答案 0 :(得分:1)
_pointer
的类型是函数指针。 dataKeyword::consoleWrite
是一个成员函数。这些不能绑定到常规函数指针,因为没有&#34; this
&#34;论点。你可以得到一个成员函数指针,它允许&#34; this
&#34;。您不能直接获取对象的成员函数的地址,您只能获取通过该类访问的成员的地址。
此外,所有_UPPERCASE
名称严格保留用于实施。您正在使用它们来调用未定义的行为。
此外,所有_something
名称都保留在全局名称空间中。
答案 1 :(得分:0)
在C ++中,命名空间级别的所有内容都必须是声明。
_dataKeyword[0]._name="consoleWrite";
_dataKeyword[0]._type=_FUNCTION;
_dataKeyword[0]._argumets=1;
_dataKeyword[0]._pointer=&_consoleApi._consoleWrite;
这些是陈述,而不是声明。它们只能出现在函数体中。
答案 2 :(得分:0)
您不能在全局范围内拥有任意语句。语句必须是函数的一部分(或类似的东西,例如类的构造函数)。
您在全球范围内拥有的只是声明。声明以关键字或类型名称开头。编译器看到_dataKeyword
,知道它在全局范围内,知道_dataKeyword
既不是关键字也不是类型名称,因此立即将此标记为错误。
您可以直接在声明中初始化数组,具体取决于数组元素类型,但要使用语句分配给元素,这些语句需要在函数中。