c++ - 使用 C++11 的 boost::date_time 编译失败

标签 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 声明。如果有效,我会尝试并提供我自己的答案。但我真的不知道。 (编辑:这个想法是失败的,所以不要尝试。)

最佳答案

您遇到麻烦的原因是 =delete 在编译时触发,以防您尝试使用它。您现有的代码之所以有效,是因为复制构造函数需要可访问(确实如此),但它已通过复制省略进行了优化。链接器本应捕捉到复制函数的使用,因此从不提示,一切似乎都很好。也就是说,您可以简单地将代码更改为

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

并消除对可访问(甚至现有)复制函数的需求。

关于c++ - 使用 C++11 的 boost::date_time 编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19434138/

相关文章:

c++ - Omnet 和 Inet 链接错误 : undefined reference to typinfo

c++ - 如何惯用地为不可变类定义赋值运算符?

c++ - Boost.Test 中的异常双重释放

c++ - PIMPL 无法在 macOS 上编译

c++ - std::unordered_set 中的非常量 find()

c++ - 什么是模板上下文中的成员枚举?

c++ - 为 C++ 类播种 rand()

c++ - 成员函数上的 boost::enable_if,重载返回类型

c++ - 自 1.55 以来 boost::bind/boost::function 的奇怪行为变化

c++ - 是否允许主线程在进入 main() 之前生成 POSIX 线程?