由于头文件层次结构,C3646和C4430?

时间:2018-02-28 09:21:06

标签: c++ visual-studio compiler-errors header-files

我遇到了两个编译错误:C3646和C4430。让我告诉你:

我指的是这个头文件:

Timer.h

class Timer {
}

这段源代码工作正常(在头文件中):

#include "Timer.h"
class Something{
    Timer timer_;

这段源代码不起作用(在另一个头文件中):

class Something_else : public Singleton<Something_else> {
    friend Singleton<Something_else>;
    Timer getDebuggerTimer;

我得到的编译错误是上面提到的:

  

C3646&#39; getDebuggerTime&#39;:未知覆盖说明符

     

C4430缺少说明符 - 假设为int。

我试图包含上面提到的头文件Timer.h,但这会让事情变得更糟(我相信这个文件已经通过其他包含条目包含在内)。

为什么编译器需要覆盖说明符? (据我所知,他们没有必要,我只是在课堂上添加一个属性?)

在使用它的其他地方,该值将填入相应类的构造函数中(也在头文件中)。这会对这个问题产生什么影响吗?

供您参考:Singleton用于实现相应的设计模式。

额外评论:问题(乍看之下)似乎与命名空间无关。

1 个答案:

答案 0 :(得分:0)

与此同时,我已经理解了问题的根本原因:

如上所述,在源代码(头文件)中,写有:

Timer getDebuggerTimer;

Visual Studio的编辑器接受这行源代码(单词Timer下没有红色波浪),在按F12的同时,我进入Timer.h文件,其中定义了上述类。

但是,编译器似乎不同意:编译器在头文件“Timer.h”中找不到Timer类的定义,但是他没有给出identifier not understood,而是那个奇怪的编译信息。

我是怎么发现的?

我已将Timer getDebuggerTimer替换为BlablaTimer getDebuggerTimer。当这样做时,编辑器显示提示identifier "BlablaTimer" is undefined,但编译器继续给出相同的编译器错误C3646和C4430。

我现在正在深入挖掘,以便知道如何解决这个问题,但我确实认为简单的undefined identifier不应该被编译器显示为奇怪的unknown override specifier