首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boost::iterator_adaptor时出现非信息性错误

使用boost::iterator_adaptor时出现非信息性错误
EN

Stack Overflow用户
提问于 2010-12-14 13:13:28
回答 2查看 329关注 0票数 3

我正在尝试使用boost::iterator_adaptorboostprogress_display包装一个istream

代码语言:javascript
复制
class ifstreamWithProgress: public boost::iterator_adaptor <
  ifstreamWithProgress,
  char*,
  boost::use_default,
    boost::forward_traversal_tag > {
public:
//  ifstreamWithProgress(const char* fname_) {}
  ifstreamWithProgress(): iter(std::istream_iterator<char>()), pd(0)
  {}

  ifstreamWithProgress(const std::string& fname_): fname(fname_), fsize(0), pd(fsize) {
    std::ifstream file(fname.c_str(), std::ios::binary);
    fsize = file.tellg();
    file.seekg(0, std::ios::end);
    fsize = file.tellg() -  fsize;
    file.seekg(0, std::ios::beg);
    iter = std::istream_iterator<char>(file);
    pd.restart(fsize);
  }

  ~ifstreamWithProgress() {
    while( ++pd < fsize);
  }

  const std::istream_iterator<char> getRawIstream() const {
    return iter;
  }

private:
  std::string fname;
  friend class boost::iterator_core_access;
  std::istream_iterator<char> iter;
  std::streampos fsize;
  progress_display pd;

  void increments() {
    iter++;
    ++pd;
  }

  bool equal(const ifstreamWithProgress& rhs) const {
    return this->iter == rhs.getRawIstream();
  }
};

这段代码会编译。然而,当我开始做像这样的事情时

代码语言:javascript
复制
  ifstreamWithProgress is("data.txt");
  ifstreamWithProgress eos;
  is != eos;

我得到一个编译时错误,告诉我它是不可复制的。这有一定的意义,因为display类是从boost::noncopyable派生的。然而,我不明白的是复制发生在哪里。有什么建议吗?

PS:错误消息是

代码语言:javascript
复制
1>c:\users\leon.sit\documents\myprojects\c++\general_models\phoenixdsm\phx\fileProgressBarWrapper.hpp(58) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
1>        C:\Program Files\boost\boost_1_44\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1>        C:\Program Files\boost\boost_1_44\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable'
1>        This diagnostic occurred in the compiler generated function 'ifstreamWithProgress::ifstreamWithProgress(const ifstreamWithProgress &)'

它没有指向源代码中的任何地方。但是,它在对比较行进行注释之后进行编译。

EN

回答 2

Stack Overflow用户

发布于 2010-12-14 14:37:38

复制不一定要在任何地方发生才会产生这个错误。它简单地反映了这样一个事实:编译器必须生成一个复制构造函数。但要做到这一点,它还必须复制progress_display,这是不可能的,因为后者的复制构造函数是私有的。

您可以通过声明指向progress_display成员的指针并定义自己的复制构造函数和=运算符来解决此问题。例如:

代码语言:javascript
复制
class ifstreamWithProgress: public boost::iterator_adaptor <
  ifstreamWithProgress,
  char*,
  boost::use_default,
    boost::forward_traversal_tag > {
public:
  ifstreamWithProgress() : pd(0) {
    pd = new progress_display(...);
  }

  ifstreamWithProgress::ifstreamWithProgress(const ifstreamWithProgress &r) : pd(0) {
    pd = new progress_display(...);
  }

  ~ifstreamWithProgress() {
    if (0 != pd) {
      delete pd;
    }
  }

  ifstreamWithProgress& operator= (const ifstreamWithProgress &r) {
    if (0 != pd) {
      delete pd;
    }
    pd = new progress_display(...);
    return *this;
  }

private:
  progress_display *pd;
};

或者,您可以使用shared_ptr<progress_display>

票数 1
EN

Stack Overflow用户

发布于 2010-12-16 16:59:53

迭代器旨在成为可复制的轻量级对象。所有接受迭代器的标准实用程序都通过值参数获取迭代器。boost_adaptor定义的不等式operator !=也不例外。因此是这样的:

代码语言:javascript
复制
is != eos;

匹配项:

代码语言:javascript
复制
bool operator != (ifstreamWithProgress, ifstreamWithProgress);

(或等效项之一)。这将调用ifstreamWithProgress的复制构造函数,而该构造函数又无法生成,因为您的一个成员是不可复制的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4436107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档