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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于头文件层次结构,C3646和C4430?相关的知识,希望对你有一定的参考价值。

我遇到了两个编译错误: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'getDebuggerTime':未知的覆盖说明符

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

我试图包括提到的头文件Timer.h,但这使事情变得更糟(我相信这个文件已经包含在其他包含条目中)。

为什么编译器期望覆盖说明符? (据我所知,他们不需要它们,我只是在一个类中添加一个属性?)

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

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

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

答案

同时我了解问题的根本原因:

如前所述,在源代码(头文件)中,有以下内容:

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

以上是关于由于头文件层次结构,C3646和C4430?的主要内容,如果未能解决你的问题,请参考以下文章

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

声明Windows API结构(DCB)的对象 - 错误C4430:缺少类型说明符 - 假定为int

C++ 编译错误 C2146 和 C4430

C++ 和 Visual Studio 2017:错误 c4430 [重复]

以前的定义在这里 - XCode 4.2.1中的Ghost文件