这个C ++标头的布局方式有什么问题吗?

时间:2009-11-06 22:59:20

标签: c++

#pragma once
#include "LudoCore/Singleton.h"

class LudoTimer : public Singleton<LudoTimer>
{
    friend class Singleton<LudoTimer>;

public:
    void Update();
    void ShortenDay();
    void LengthenDay();
    UINT64 GetDeltaTime() const;
    float GetPercentageOfDayElapsed() const;

private:
    LudoTimer();
    ~LudoTimer();

    UINT64 GetTickCount64() const;
    UINT64 GetElapsedSeconds() const;

    UINT64 m_DeltaTime;

    // Tick Count
    UINT64 m_CurrFrameTick;
    UINT64 m_LastFrameTick;

    int m_SecondsInADay;
    static const int SHORTEST_POSSIBLE_DAY = 60;
    static const int LONGEST_POSSIBLE_DAY = 86400;
    static const int CHANGING_INTERVAL = 600;
};

对我来说,上面的代码看起来很正常。但是,我是C ++的新手,所以我可能会遗漏一些细微差别。我从它那里得到了一堆编译器错误,例如:

  

错误C2447:'{':缺少函数头(旧式正式列表?)

  

错误C2236:意外的'类'   'LudoTimer'。你忘记了';'吗?

什么给了!

4 个答案:

答案 0 :(得分:8)

查看其他标题(LudoCore / Singleton.h)。第二个错误意味着错误发生在顶部的class LudoTimer声明之前。

我的猜测是Singleton.h定义了一个类,并且缺少';'在那个班级定义之后。

答案 1 :(得分:3)

错误可能在LudoCore/Singleton.h或之前包含的其他内容中。确保您的class定义后面有;个分号和所有内容。

快速测试:注释掉#include并在那里粘贴template<class C> class Singleton;预先声明。如果编译器现在抱怨不完整的类型,我是对的,如果没有,发布更多细节。

答案 2 :(得分:3)

嗯,以下编译对我来说很好,所以错误很可能不在你给我们的代码中。我建议您再次查看Mike's suggestion Singleton.h中的错误。

//#include "LudoCore/Singleton.h"
#include <windows.h>

template< typename T >
class Singleton {};

class LudoTimer : public Singleton<LudoTimer>
{
    friend class Singleton<LudoTimer>;
public:
    void Update();
    void ShortenDay();
    void LengthenDay();
    UINT64 GetDeltaTime() const;
    float GetPercentageOfDayElapsed() const;
private:
    LudoTimer();
    ~LudoTimer();

    UINT64 GetTickCount64() const;
    UINT64 GetElapsedSeconds() const;

    UINT64 m_DeltaTime;

    // Tick Count
    UINT64 m_CurrFrameTick;
    UINT64 m_LastFrameTick;

    int m_SecondsInADay;
    static const int SHORTEST_POSSIBLE_DAY = 60;
    static const int LONGEST_POSSIBLE_DAY = 86400;
    static const int CHANGING_INTERVAL = 600;
};

答案 3 :(得分:1)

我想知道LudoTimer是否被宣布为Singleton使用它并且前向声明是否有帮助?我在VisualStudio 2005中不需要一个,就像sbi一样,我可以通过提供Singleton声明来编译代码。如果我添加了一个简单的实现,我甚至可以这样做:

    LudoTimer* timer = Singleton<LudoTimer>::instance();

还有一件事:

    error C2236: unexpected 'class' 'LudoTimer'. Did you forget a ';'?

您可以尝试在#include之后的空白行上添加分号来回答此问题。如果它有帮助那么您可以显示头文件中存在问题而无需编辑它。