Я пытался скомпилировать некоторый код, который использует 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 / signal2 / 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 выглядит как простое предварительное объявление. С чем это может быть проблематично, если оно идет после определения шаблона?
EDIT
Похоже, это ошибка Boost.Signals2, поскольку объявление вещей в пространстве имен std :: приводит к неопределенному поведению в соответствии со стандартом ISO / IEC C ++ 2011, раздел 17.6.4.2.1:
Поведение программы на C ++ не определено, если она добавляет объявления или
определения к пространству имен std или к пространству имен в пространстве имен std
если не указано иное. Программа может добавить шаблон
специализация
для любого стандартного шаблона библиотеки в пространство имен std, только если объявление зависит от определенного пользователем типа
и специализация соответствует стандартным требованиям библиотеки для исходного шаблона и явно не
Запрещенный.
Создан тикет в трекере ошибок Boost: https://svn.boost.org/trac/boost/ticket/6655
Обратите внимание, что здесь также существует ошибка Clang: http://llvm.org/bugs/show_bug.cgi?id=10521, однако разработчик указывает на нарушение.
Продолжение для Googlers :
Проблема действительно была в ошибке Boost. Эта changeset 77289 должна решить проблему с Boost 1.50.
Соответствующая ошибка в Clang была помечена как недействительная.