编辑:我知道一个人不能转发声明typedef,并且有很多q得出结论(实际上,我链接到一个)。但是他们都没有解释为什么这是不允许的。我不是在寻找解决方法。我想了解基本原理。
事实证明您是can't forward-declare a using-directive(或typedef)。即您不能这样做:
接口:
class Impl;
using Concrete = shared_ptr<Impl>;
实施:
using Impl = std::function<Foo(const Foo&)>; //DOES NOT COMPILE
相反,您必须创建一个包装std :: function的单元素类Impl
。
禁止这样做的背后原理是什么? AFAICS可以使用诸如class Impl
之类的前向声明类型来存储指向Impl
的指针或引用……并且即使后来将Impl
定义为类似于int
或函数指针等等。
(请注意,typename Impl
似乎不是向前声明类型的有效方法。)