为什么我不能通过别名来定义前向声明 class?

Why can't I define a forward declared class by aliasing it?

由于 "conflicting declaration",尝试编译以下代码失败。为什么我不能像这样定义前向声明 class?

我这样做是为了隐藏该实现使用了某个库。虽然我承认这并没有真正抽象任何东西——你仍然需要知道实现使用什么来进行正确的调用——我仍然对为什么这不感兴趣工作。

Bar.cpp:

#include "Bar.hpp"
#include "Foo.hpp"

using Foo = ns::Foo;

void Bar::foo(Foo f) {
}

Bar.hpp:

class Foo;

class Bar {
    void foo(Foo f);
};

Foo.hpp:

namespace ns {

    class Foo {
    };
}

明确地说,我想知道为什么不能通过别名定义先前声明的 class - 换句话说就是 "use that definition over there that has a different name"

因为为了使 Bar::Foo 起作用,Bar class 需要在声明 Foo 参数时尽早知道它的大小。 您可以通过声明 void foo(Foo* f); 来完成这项工作 这样,编译器就不会知道 Foo 的大小,而是只关心指针的大小。 只需使用来选择您需要的命名空间:

using namespace ns;

您声明了 Foo 两次,但类型有冲突。首先,您将 Bar.hpp 中的 Foo 声明为:

class Foo;

随后,您将 Bar.cpp 中的 foo 声明为:

using Foo = ns::Foo;

如果您在源文件中定义了同名的别名,则不能像这样进行前向声明,因为这样您就声明了两个具有完全相同名称的不同类型。

根据你的问题,我假设你想使用 Foo,但它的命名空间不在 Bar.cpp 中。解决方法如下:

Bar.cpp

#include "Bar.hpp"
#include "Foo.hpp"

using ns::Foo;

void Bar::foo(Foo f) {}

Bar.hpp

namespace ns
{
    class Foo;
}

class Bar 
{
    void foo(ns::Foo f);
};

Foo.hpp

namespace ns
{
    class Foo
    {};
}