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

时间:2016-03-17 10:03:58

标签: c++ using forward-declaration conceptual

由于"冲突声明",尝试编译下面的代码失败。为什么我不能像这样定义一个前向声明的类?

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

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 {
    };
}

要清楚,我想知道为什么不能通过别名来定义先前声明的类 - 换句话说说"在那里使用具有不同名称的定义"

2 个答案:

答案 0 :(得分:4)

您使用冲突类型声明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
    {};
}

答案 1 :(得分:0)

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

using namespace ns;