【发布时间】:2018-08-13 10:26:38
【问题描述】:
我有一个命名空间N0,它有包括N1 在内的子命名空间。调用代码只知道外部命名空间。我想在外部命名空间中编写一个函数,该函数返回一个std::unique_ptr<N1::T>,该结果在N0 的其他地方使用。但是,调用者不应该知道N1。我想做的是:
// N0.h
namespace N0 {
typename T; // This isn't real C++.
std::unique_ptr<T> foo();
void bar(std::unique_ptr<T>&&);
}
// N0.cpp
#include "N1.h" // Get N1::T
namespace N0 {
typedef N1::T T;
...
}
也就是说,我想公开一个调用者看不到的类型,但在内部我想实际使用不同命名空间中的类型。这样,其他人可以直接声明namespace N0 { class T; },而不必知道T实际上在N1中。
我可以将T 本身移动到N0,但它确实属于N1。
我可以用N0 中的虚拟类包装T,但这很丑,指针基本上应该这样做。
我可能会创建一个 N0::T 的子类 N1::T,但这似乎也很恶心。
N0 有没有办法转发声明“我有一个类型,而你不需要知道它是什么”并且该类型实际上位于不同的命名空间中?换句话说:为什么class C; class C{}; 合法而class C; typedef int C; 是非法的? (同样class C; using C = int; 或typedef C; typedef int C;。)它们在我看来基本相同,我想不出一个巧妙的模板技巧来解决它。我能想到的唯一区别是 typedef 版本不受 Koenig 查找的影响。
【问题讨论】:
-
我不这么认为。我只是希望
N0能够公开说“我有一个类型T”,你可以有指针,然后私下让N0将其定义为“实际上当我说T我的意思是N1::T. -
继承可能是一个选项stackoverflow.com/a/44136249/597607
标签: c++ namespaces forward-declaration