枚举没有命名类型,(没有循环依赖)

时间:2016-06-06 09:32:34

标签: c++ enums

我遇到一个问题,编译器在枚举没有命名类型的情况下尖叫。 我在这里看了其他帖子(枚举没有命名类型),但大多数都是因为循环依赖问题。

输入/ RegisteredKeyEventCallback.h中的

代码

#pragma once

#include "UserDefinableInput.h"
#include "../Game/Other/CallBack/CallBack.h"
#include "../Containers/LinkedList/LinkedList.h"
#include "../HashFunctions/HashFunctions.h"

using namespace std;

class InputManager;

/**
* @brief structure for saving all callbacks that belong to one ID.
*/
struct RegisteredKeyEventCallback
{
    enum KEY_EVENT_TYPE_ENUM
    {
        KEY_PRESS, /**< When key was released and is pressed. Fired only once */
        WHILE_KEY_DOWN, /**< Fired while the key is down. Multiple times */
        KEY_RELEASE, /**< When key was pressed and is released now. Fired only once */
        _NULL
    };

    /**
    * @brief Creates new empty instance
    */
    RegisteredKeyEventCallback();
    ~RegisteredKeyEventCallback();

  ...
};

hashfunctions.h

#pragma once
struct RegisteredKeyEventCallback;

struct KEY_EVENT_TYPE_ENUM_Hasher
{
   size_t operator()(const RegisteredKeyEventCallback::KEY_EVENT_TYPE_ENUM& k) const;
};

对不起,如果我失明,但我看不到。循环依赖不应该存在,正如我所说,并且我提供的hashfunctions.h是所有代码。

仍然是编译错误 错误:struct RegisteredKeyEventCallback中的KEY_EVENT_TYPE_ENUM未命名类型。

任何帮助将不胜感激。谢谢。

编辑:谢谢您的建议,我设法解决了这个问题

输入/ RegisteredKeyEventCallback.h中的

代码

#pragma once

#include "UserDefinableInput.h"
#include "../Game/Other/CallBack/CallBack.h"
#include "../Containers/LinkedList/LinkedList.h"
#include "../HashFunctions/HashFunctions.h"

using namespace std;

class InputManager;
struct HashFunctions; //<---------------------------
/**
* @brief structure for saving all callbacks that belong to one ID.
*/

HashFunctions.h

#pragma once

#include "../Input/RegisteredKeyEventCallback.h"

struct KEY_EVENT_TYPE_ENUM_Hasher
{

    size_t operator()(const RegisteredKeyEventCallback::KEY_EVENT_TYPE_ENUM& k) const;
};

1 个答案:

答案 0 :(得分:3)

你是对的,你没有循环依赖,但这不是问题。问题在于HashFunctions.h编译器不知道RegisteredKeyEventCallback::KEY_EVENT_TYPE_ENUM是什么。

通过对RegisteredKeyEventCallback类进行前向声明,您只能对类本身进行前向声明,而不是其成员。您需要在RegisteredKeyEventCallback头文件中完整定义HashFunctions.h其成员,这意味着您将获得需要以其他方式解决的循环依赖关系。