【问题标题】:boost::date_time with C++11 fails to compile使用 C++11 的 boost::date_time 无法编译
【发布时间】:2013-10-17 18:11:50
【问题描述】:

我最近将我的英特尔 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 声明。如果可行,我会尝试并提供我自己的答案。但我真的不知道。 (编辑:这个想法是失败的,所以不要尝试。)

【问题讨论】:

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


    【解决方案1】:

    您遇到麻烦的原因是=delete 在编译时触发,以防您尝试使用它。您现有的代码有效,因为复制构造函数需要可访问(这是),但它被复制省略优化掉了。链接器,应该捕捉到 copy-ctor 的使用,因此从不抱怨,一切看起来都很好。也就是说,您可能只需将代码更改为

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

    并消除对可访问(或什至现有)copy-ctor 的需要。

    【讨论】:

    • 是的,这解决了我的问题。我的常量是使用不存在的复制构造函数。我是个白痴,我猜优化器多年来一直在保护我免受白痴的影响。 C++11 来救援!
    【解决方案2】:

    为什么不能简单写

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

    附:看来早期版本的编译器有bug。:)

    【讨论】:

    • 谢谢。 Checkmark 向 Daniel Frey 寻求额外的解释,以了解它过去为何一直有效。但你是绝对正确的!
    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2014-11-10
    • 2014-01-10
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多