c++ - VC++ 2010 : 'missing type specifier' errors come and go without changes to code

标签 c++ visual-c++ include visual-c++-2010

假设有四个文件:foo.h、foo.cpp、bar.h、bar.cpp。

foo.h:

#pragma once

class foo
{
    // Whatever
};

foo.cpp

#include "foo.h"

// Foo's definitions

bar.h

#pragma once

class bar
{
    bar(const foo & f); // < C4430 'missing type specifier' (not always)
    // Other declarations
};

bar.cpp

#include "foo.h"
#include "bar.h"

// Bar's definitions

编译器说 bar.h 中有 C4430。但奇怪的是,我能够通过注释然后取消对该行的注释来构建代码。当然,构建也失败了,行也被注释了,但是当我取消注释时,我就成功构建了。因此,相同的代码可能会或可能不会产生错误。

我的VS是10.0.40219.1 SP1Rel,项目类型是Win32 DLL。

最佳答案

你需要在bar.h中包含foo.h:

#pragma once

#include "foo.h"
class bar
{
    bar(const foo & f);
};

如果您需要完整的类定义,除非您使用指针(在这种情况下前向声明就足够了),否则您需要包含声明该类的文件。

为什么有时编译有时失败?

取决于编译器。我的猜测是 foo.h 包含在到达 bar.h 之前编译的文件中。所以 bar.h 已经知道 foo 的定义。如果构建失败,则跳过成功编译的文件,并且可能不再包含 foo.h。或者,如果您仅在 x.cpp 中进行更改,编译器将仅构建该文件并可能跳过包含在一个文件中的 foo.h已经编译好了。

我希望我说的很清楚。

为什么你已经拥有的还不够?

你可能会说

//Bar.cpp
#include "foo.h"
#include "bar.h"

// Bar's definitions

bar.h 之前包含 foo.h。确实如此,但是如果 bar.h 包含在不同位置的 foo.h 之前怎么办?这就是为什么在 bar.h 中包含 foo.h 是个好主意。任何包含 bar.h 的文件将不再需要包含 foo.h(必须包含它才能编译),并且在文件中包含您需要的所有内容更有意义。前向声明不是这种情况,但同样,您使用的是完整类型,而不是指针。

关于c++ - VC++ 2010 : 'missing type specifier' errors come and go without changes to code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8228885/

相关文章:

sql - Sequelize 包含、连接、限制关联表

c++ - 在函数中抑制 cout 输出

c++ - 从 unordered_multimap 中删除元素

C++ Diamond 控制台输出问题

c++ - C->C++ 在未给出类型的情况下,在#define 中自动将 void 指针转换为 C++ 中的类型指针(C 风格)[MSVS]

c++ - 访问注册表数据以设置链接器和包含路径

c++ - 为什么不能#include同一目录中另一个文件中的类?

c++ - 如果手动关闭程序,是否会调用析构函数?

c++ - C++ 中的类开销

c++ - ATL COM 是开发 IE7 或更高版本插件/扩展的唯一途径吗?