2012-03-06 78 views
1

我试图编译一些使用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 

现在是谁的责任?

两件事情浮现在脑海中:

  1. 为什么Boost.Signals头觉得有必要声明一个自己的shared_ptr?有什么收获?
  2. 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被标记为无效。

+3

看起来像Boost.Signals2中的一个非常明显的错误给我。 – ildjarn 2012-03-06 00:21:54

+0

@ildjarn:只要boost库不会尝试*定义它们,应该没有问题*声明模板。这个错误似乎表明根本没有定义 - 显然,包括''没有按预期定义'std :: shared_ptr'。 – 2012-03-06 00:35:05

+0

@Mike:然而,Boost代码中的'#if'显然是错误的(或者至少不是理想的)。 – ildjarn 2012-03-06 00:38:09

回答

-1

foreign_ptr.hpp的代码是一个重声明(如果shared_ptr已经被定义),因此不容易造成问题(添加了声明std在技术上是未定义的行为,但大多数编译器不关心,因为他们不真正区分标准库头文件和其他文件)。所以错误只能由shared_ptr实际上是未定义的。

现在libc++显然有一个定义shared_ptr,所以我只能怀疑一些C++ 03库以某种方式将它包含到包含路径并且优先于libC++。

+0

好主意,但我检查了包含路径(使用-v开关),并且在libC++之前没有其他头文件。 – 2012-03-06 09:28:58

+0

我认为关键的一点是,它是未定义的行为!该标准在17.6.4.2.1中提到它。我将编辑解释并报告针对Boost.Signals2的Bug。 – 2012-03-06 09:46:48

+0

这个答案不正确。该错误最近由libC++在嵌套在std内的命名空间中声明shared_ptr引起,并且由升压代码的未定义行为引起。 – 2012-03-21 05:23:38