неявная реализация неопределенного шаблона: Boost Bug или Clang Bug? - PullRequest
2 голосов
/ 06 марта 2012

Я пытался скомпилировать некоторый код, который использует 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

Теперь, кто виноват?

На ум приходят две вещи:

  1. Почему заголовок Boost.Signals считает необходимым объявить собственный shared_ptr? В чем выгода?
  2. Строка в 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 была помечена как недействительная.

1 Ответ

0 голосов
/ 06 марта 2012

Код в foreign_ptr.hpp является повторным объявлением (если shared_ptr уже определен), и поэтому вряд ли вызовет проблемы (добавление объявлений в std является технически неопределенным поведением, но большинству компиляторов это все равнопоскольку они не различают заголовки стандартной библиотеки и другие файлы).Таким образом, ошибка может быть вызвана только тем, что shared_ptr фактически не определено.

Теперь libc++, очевидно, имеет определение shared_ptr, поэтому я могу только подозревать, что некоторая библиотека C ++ 03 добралась до пути включениякак-то и получил преимущество над libc ++.

...