这个问题在这里已有答案:
我在标题中声明了一个TMultiReadExclusiveWriteSynchronizer
类型的指针。为此,我想使用前向声明
class TMultiReadExclusiveWriteSynchronizer;
因为描述此类的vcl.h
库已包含在cpp
文件中。
但是,如果我像下面的例子中那样做,我收到一个错误:
暧昧的名字
因为编译器在我的前向声明和TMultiReadExclusiveWriteSynchronizer
(它是System::Sysutils::TMultiReadExclusiveWriteSynchronizer
的一部分)中找到了名称vcl.h
。
没有我的前向声明,编译器告诉我这种类型是未知的。我不明白,为什么编译器在我不使用前向声明时找不到TMultiReadExclusiveWriteSynchronizer
类,但是如果我使用了一个,那么编译器就会发生名称冲突。
怎么能在System::Sysutils::TMultiReadExclusiveWriteSynchronizer
找到这个名字?这不包括在我的标题中。就像我下面的例子一样,我的hpp
文件没有包含。
我该如何解决这个问题?
当然,我可以在我的标题中包含System::Sysutils
,或者在我的cpp
中更改包含的顺序。但是,当我只需要一个简单的前向声明时,我不想包含某些内容。
file.hpp
class TMultiReadExclusiveWriteSynchronizer;
....
TMultiReadExclusiveWriteSynchronizer* sync;
file.cpp
#include "file.hpp"
#include <vcl.h>
....
在file.hpp
,前瞻性声明应该是:
namespace System {
namespace Sysutils {
class TMultiReadExclusiveWriteSynchronizer;
}
}
并且可能对类型的所有引用(至少在头文件中)应该具有完全限定名称System::Sysutils::TMultiReadExclusiveWriteSynchronizer
。