前向声明中的名称冲突

Name conflict in forward declaration

我在 header 中声明了一个 TMultiReadExclusiveWriteSynchronizer 类型的指针。为此,我想使用前向声明

class TMultiReadExclusiveWriteSynchronizer;

因为描述这个class的vcl.h库已经包含在cpp文件中。

但是如果我像下面的例子那样做,我会得到一个错误:

ambigious name

因为编译器在我的前向声明和 System::Sysutils::TMultiReadExclusiveWriteSynchronizer(它是 vcl.h 的一部分)中找到名称 TMultiReadExclusiveWriteSynchronizer

没有我的前向声明,编译器告诉我这个类型是未知的。 我不明白,为什么编译器在我不使用前向声明时找不到 TMultiReadExclusiveWriteSynchronizer class,但如果我使用前向声明,则编译器会发生名称冲突。

它怎么能在System::Sysutils::TMultiReadExclusiveWriteSynchronizer中找到名字?这不包括在我的 header 中。就像我下面的例子一样,我的 hpp 文件没有包含。

我该如何解决这个问题?

当然,我可以只在我的 header 中包含 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