【发布时间】:2012-03-06 00:13:38
【问题描述】:
我试图编译一些使用 Boost (1.49) 的代码,以及来自主干的 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
现在该怪谁?
想到两件事:
- 为什么 Boost.Signals 标头感觉需要声明自己的 shared_ptr?有什么收获?
- Boost.Signals 中的行看起来像一个简单的前向声明。如果它出现在模板定义之后,为什么会有问题?
编辑
这似乎是一个 Boost.Signals2 错误,因为根据 ISO/IEC C++ 2011 标准第 17.6.4.2.1 节,在 std:: 命名空间中声明事物会导致未定义的行为:
如果 C++ 程序添加声明或 定义到命名空间 std 或命名空间 std 内的命名空间 除非另有规定。程序可以添加模板 专业化 仅当声明依赖于用户定义的类型时,任何标准库模板才能命名空间 std 并且专业化满足原始模板的标准库要求并且没有明确 禁止。
已在 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 被标记为无效。
【问题讨论】:
-
这看起来是一个简单的前向声明,不应该让任何人感到困惑。我宁愿认为默认情况下 CLang 不会在内存中提供 tr1
shared_ptr...您的琐碎main是否在不包含<boost/signals2.hpp>的情况下编译? -
对我来说看起来像是 Boost.Signals2 中的一个非常明显的错误。
-
@ildjarn:只要 boost 库不尝试定义模板,声明模板应该没有问题.该错误似乎表明根本没有定义 - 显然,包括
<memory>没有按预期定义std::shared_ptr。 -
@Mike :确实,但是 Boost 代码中的
#if显然是错误的(或至少不太理想)。 -
是的,确实如此。另外,如果我自己在代码中做出相同的声明,编译会失败并显示相同的消息,所以它可能是一个 Clang 错误。
标签: c++ boost clang shared-ptr