【问题标题】:Can't assign iterator with no viable overloaded '=' error无法分配没有可行的重载“=”错误的迭代器
【发布时间】:2015-03-15 22:09:28
【问题描述】:

我有一个字段定义为

const vector<record>* data;

其中记录被定义为

const unique_ptr<vector<float>> features;
const float label;

在我的主要代码中,我使用

vector<record>::iterator iter = data->begin()

编译器对我的代码不满意,因为在该迭代器赋值行出现了不可行的重载 '=' 错误。它也会产生这个警告:

/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1097:7: note: candidate function (the implicit copy assignment operator) not viable: no known conversion from '__wrap_iter<const_pointer>' to 'const __wrap_iter<class MLx::Example *>' for 1st argument

我做错了什么?

【问题讨论】:

  • vector&lt;record&gt;::const_iterator 可以代替吗? (或 auto 如果你有 c++11)
  • 第一个问题:为什么将data 定义为指向向量的指针?这通常本身就是一个糟糕的主意。显式输入迭代器的类型通常也表明存在问题。
  • @JerryCoffin,我正在实现一个包装迭代器,它派生一个抽象迭代器。这个包装器有一个指向数据本身的指针。它不应该管理数据。这仍然是一个坏主意吗?您对更好的设计有什么建议?
  • 另一件事是我试图在问题中简化我的代码。在我的代码中,iter 是一个字段,而不是一个局部变量。这就是为什么我需要显式声明它的类型。

标签: c++ stl unique-ptr


【解决方案1】:

“迭代器应该是轻量级的,现在应该拥有数据,即当我进行分配时,不应该尝试复制甚至触摸记录。”

它与迭代器无关拥有存储在数据data 中的数据,但const unique_ptr&lt;&gt; 限制仅作为const 实例访问模板参数类型。
这意味着反过来,您需要使用

vector<record>::const_iterator iter = data->begin();
             // ^^^^^^

在您的主代码中。

这很像写作

const vector<record>* data;

正如@Jonathan Potter 在他的评论中提到的那样

auto iter = data->begin();

应该也可以。

【讨论】:

  • data 是常量吗?
  • 是的,我将数据定义为 const。这可能就是原因。
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多