gpt4 book ai didi

c++ - 未定义模板的隐式实例化 : Boost Bug or Clang Bug?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:33 30 4
gpt4 key购买 nike

我试图编译一些使用 Boost (1.49) 的代码,使用 trunk 中的 Clang(& libc++)。有问题的代码归结为以下内容:

#include <memory>
#include <boost/signals2.hpp>

int main()
{
std::shared_ptr<int> s;
}

使用 Clang 编译时,会发出以下消息:

$ clang++ -I/home/alexander/usr/local/include --stdlib=libc++ -std=c++0x signals2-bug.cpp   -o signals2-bug
signals2-bug.cpp:6:26: error: implicit instantiation of undefined template
'std::shared_ptr<int>'
std::shared_ptr<int> s;
^
/home/alexander/usr/local/include/boost/signals2/detail/foreign_ptr.hpp:24:30: note:
template is declared here
template<typename T> class shared_ptr;
^

boost/signals2/detail/foreign_ptr.hpp 中有问题的行是:

#if !defined(BOOST_INTEL_STDCXX0X)
namespace std
{
template<typename T> class shared_ptr;
template<typename T> class weak_ptr;
}
#endif

现在该怪谁了?

我想到了两件事:

  1. 为什么 Boost.Signals header 需要声明自己的 shared_ptr?有什么好处?
  2. Boost.Signals 中的行看起来像一个简单的前向声明。如果它出现在模板定义之后,为什么会有问题?

编辑

这似乎是一个 Boost.Signals2 错误,因为根据 ISO/IEC C++ 2011 标准第 17.6.4.2.1 节,std::命名空间中的事物声明会导致未定义的行为:

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

已创建 Boost 错误跟踪器中的票证:https://svn.boost.org/trac/boost/ticket/6655

请注意,此处还存在一个 Clang 错误:http://llvm.org/bugs/show_bug.cgi?id=10521 ,但是实现者指出违规行为。

Google 员工的跟进:

问题确实是一个 Boost 错误。这changeset 77289应该解决 Boost 1.50 的问题。Clang 中相应的 Bug 被标记为无效。

最佳答案

foreign_ptr.hpp 中的代码是重新声明(如果 shared_ptr 已经定义),因此不太可能导致问题(向 添加声明) std 在技术上是未定义的行为,但大多数编译器并不关心,因为它们并不真正区分标准库头文件和其他文件)。所以错误只能由 shared_ptr 实际上未定义引起。

现在 libc++ 显然有一个定义 shared_ptr,所以我只能怀疑某些 C++03 库以某种方式进入了包含路径,并且比 libc++ 更受青睐。

关于c++ - 未定义模板的隐式实例化 : Boost Bug or Clang Bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9576112/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com