没有命名类型,但为什么?

时间:2014-08-16 13:48:51

标签: c++

我有这个标题:

#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'没有命名类型|     ......等等。

我知道它通常意味着什么,但不是在这种情况下。怎么了?

3 个答案:

答案 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既不是关键字也不是类型名称,因此立即将此标记为错误。

您可以直接在声明中初始化数组,具体取决于数组元素类型,但要使用语句分配给元素,这些语句需要在函数中。