我试图编译一些使用Boost(1.49)的代码,并在主干上使用Clang(& libC++)。 有问题的代码归结为如下:未定义模板的隐式实例化:Boost Bug或Clang Bug?
#include <memory>
#include <boost/signals2.hpp>
int main()
{
std::shared_ptr<int> s;
}
当与编译铛,以下消息emmited:
$ 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;
^
在升压/ signals2 /细节/ foreign_ptr.hpp有问题的行是:
#if !defined(BOOST_INTEL_STDCXX0X)
namespace std
{
template<typename T> class shared_ptr;
template<typename T> class weak_ptr;
}
#endif
现在是谁的责任?
两件事情浮现在脑海中:
- 为什么Boost.Signals头觉得有必要声明一个自己的shared_ptr?有什么收获?
- Boost.Signals中的行看起来像一个简单的前向声明。为什么在模板定义之后会出现问题?
编辑
这似乎是一个Boost.Signals2错误,因为事物在的std ::命名空间导致不确定的行为的申报,根据ISO/IEC C++ 2011标准,部分17.6.4.2.1:
如果其添加声明或 定义除非另有规定空间std 内空间std或一个命名空间C++程序的行为未定义。只有当声明取决于用户定义类型 且专业化符合原始模板的标准库要求并且不明确 被禁止时,程序可以将任何标准库模板的 专用 专用 添加到名称空间std。
在升压bug跟踪票证已创建:https://svn.boost.org/trac/boost/ticket/6655
请注意,一个锵错误也存在这里:http://llvm.org/bugs/show_bug.cgi?id=10521,但实施者点冲突。
随访的Google:
的问题确实是一个加速的bug。这个changeset 77289应该解决Boost 1.50的问题。 Clang中的相应Bug被标记为无效。
看起来像Boost.Signals2中的一个非常明显的错误给我。 – ildjarn 2012-03-06 00:21:54
@ildjarn:只要boost库不会尝试*定义它们,应该没有问题*声明模板。这个错误似乎表明根本没有定义 - 显然,包括''没有按预期定义'std :: shared_ptr'。 –
2012-03-06 00:35:05
@Mike:然而,Boost代码中的'#if'显然是错误的(或者至少不是理想的)。 – ildjarn 2012-03-06 00:38:09