由于"冲突声明",尝试编译下面的代码失败。为什么我不能像这样定义一个前向声明的类?
我这样做是为了隐藏实现使用某个库。虽然我承认这并没有真正抽象出任何东西 - 你仍然需要知道实现使用什么来进行正确的调用 - 我仍然对为什么这样做没有兴趣&# 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 {
};
}
要清楚,我想知道为什么不能通过别名来定义先前声明的类 - 换句话说说"在那里使用具有不同名称的定义"
答案 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;