【问题标题】:C++: forward declaring a type defC ++:前向声明类型def
【发布时间】:2013-09-27 14:57:48
【问题描述】:

我们正在尝试使用 http://cpp-netlib.org 并未能编译它,因为在它的一个标头中它有:

namespace network {
    namespace utils {
        struct thread_pool;
    }
}

在另一个方面:

namespace network {
        namespace utils {
            typedef ::network::concurrency::thread_pool thread_pool;
    }
}

根据我对 C++ 中 Forward declaration of a typedef in C++http://www.cplusplus.com/forum/beginner/75561 的理解,这基本上是非法的 - 你不能转发声明:“struct A;”然后尝试“typedef X A;”。

所以,我的问题是,他们究竟会用什么来编译它?这是 C++11 的一些新特性吗,因为他们声称使用的是最新最好的 C++11?

【问题讨论】:

  • 你说得对,这看起来坏了。
  • 这对他们来说可能是一个更好的说法:cpp-netlib.org/#support
  • 即使在 pre-c++11 中也被破坏了
  • @stefaanv 好吧,因为这段代码实际上是来自cpp-netlib GitHub 页面的主干版本,我想它可能只是在进行中

标签: c++ c++11 typedef forward-declaration


【解决方案1】:

这基本上是违法的

是的。

所以,我的问题是,他们究竟会用什么来编译它?

也许,它们永远不会在同一个翻译单元中包含两个标题。在这种情况下,大多数编译器将无法诊断错误(不需要诊断);并且您仍有可能最终得到一个工作程序。不过,您肯定处于未定义行为的世界中。

这是 C++11 的一些新特性吗?

没有。你可以用using做各种有趣的事情来创建别名;但是您仍然不能将类型声明为类和typedef

【讨论】:

  • 这不太可能真正起作用。看到该类型的翻译单元会将使用该类型的名称混淆为::network::utils::thread_pool,但看到typedef 的翻译单元将与::someother::namespace_::andtype 混淆,我怀疑链接器不会对此感到厌烦
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
相关资源
最近更新 更多