boost :: date_time с C ++ 11 не может скомпилировать

Я недавно обновил свой компилятор Intel C ++ с версии 13.0.1 (он же 2013) до версии 14.0.0 (он же 2013 sp1). Похоже, что используемые им стандартные библиотеки стали более совместимыми с C ++ 11. Как часть этого, std :: locale :: facet был изменен с:

class locale::facet {
protected:
explicit facet (size_t refs = 0);
virtual ~facet();
private:
facet (const facet&);           // not defined
void operator= (const facet&);  // not defined
}

Для того, чтобы:

class locale::facet {
protected:
explicit facet (size_t refs = 0);
virtual ~facet();
facet (const facet&) = delete;
void operator= (const facet&) = delete;
}

Ключевой частью является использование = delete сделать его не подлежащим копированию. (Благодаря http://www.cplusplus.com/reference/locale/locale/facet/ для этого параллельного сравнения.)

Однако, boost / date_time / date_facet.hpp использует это:

class date_facet : public std::locale::facet {

Это не изменилось в обоих версиях boost v1.48.0 и v1.54.0 (те, которые я установил в своей среде).

date_facet не объявляет какой-либо конструктор копирования или operator=,

В моем собственном коде я использую его для создания статических констант класса для хранения формата времени. Таким образом, в заголовочном файле у меня есть это как часть определения класса:

static const boost::local_time::local_time_facet _MYFACET;

И в соответствующем исходном файле у меня есть это:

const boost::local_time::local_time_facet MyClass::_MYFACET = boost::local_time::local_time_facet("%Y/%m/%d %H:%M:%S.%f");

Этот код работал годами и остается неизменным.

Теперь, когда я пытаюсь скомпилировать, я получаю эту ошибку:

/usr/include/boost/date_time/date_facet.hpp(49): error #373: "std::locale::facet::facet(const std::locale::facet &)" (declared at line 409 of "/usr/include/c++/4.4.6/bits/locale_classes.h") is inaccessible
class date_facet : public std::locale::facet {
^
compilation aborted for MyFile.cpp (code 2)

Поиск в Google никому не позволял говорить об этой проблеме, и это заставляет меня думать, что я просто делаю что-то глупое.

Кто-нибудь еще сталкивался с этим?

У кого-нибудь есть решение?

Моя единственная идея состоит в том, чтобы явно добавить = delete объявление до date_facet. Я попробую это и предоставлю свой ответ, если это сработает. Но я действительно понятия не имею. (редактироватьэта идея провалилась, так что не пытайтесь.)

1

Решение

Причина ваших неприятностей в том, что =delete срабатывает во время компиляции, если вы пытаетесь его использовать. Ваш существующий код работал, потому что конструктор копирования должен был быть доступен (что было), но он был оптимизирован за счет исключения копии. Компоновщик, который должен был поймать использование copy-ctor, поэтому никогда не жаловался, и все казалось в порядке. Тем не менее, вы можете просто изменить свой код на

const boost::local_time::local_time_facet MyClass::_MYFACET("%Y/%m/%d %H:%M:%S.%f");

и устранить необходимость в доступном (или даже существующем) copy-ctor.

2

Другие решения

Почему ты не можешь просто написать

const boost::local_time::local_time_facet MyClass::_MYFACET("%Y/%m/%d %H:%M:%S.%f");

Постскриптум Похоже, в ранней версии компилятора была ошибка. 🙂

1