使用C ++ 11的boost :: date_time无法编译

时间:2013-10-17 18:11:50

标签: c++ boost c++11 boost-date-time icc

我最近将我的英特尔C ++编译器从v13.0.1(又名2013)升级到v14.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)

谷歌搜索没有出现任何人谈论这个问题,这让我觉得我只是在做一些愚蠢的事情。

其他人遇到过这个?

任何人都有解决方案吗?

我唯一的想法是明确地向date_facet添加= delete声明。如果有效,我会尝试并提供我自己的答案。但我真的不知道。 (编辑:这个想法失败了,所以不要尝试。)

2 个答案:

答案 0 :(得分:2)

您遇到麻烦的原因是=delete在编译时会触发,以防您尝试使用它。你现有的代码是有效的,因为复制构造函数需要是可访问的(事实上是这样),但它是由copy elision优化的。因此,应该使用复制程序的链接器从不抱怨并且一切似乎都很好。也就是说,您可能只是将代码更改为

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

并删除对可访问(甚至现有)拷贝的需求。

答案 1 :(得分:1)

为什么你不能简单地写

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

P.S。似乎编译器的早期版本有一个错误。:)