为什么我不能通过别名来定义前向声明 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
{};
}
由于 "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
{};
}