【问题标题】:C++ iterator for vector of struct Compiler Error结构编译器错误向量的 C++ 迭代器
【发布时间】:2015-11-19 12:42:43
【问题描述】:

我创建了一个包含两个变量的struct 类型。我在vector 中使用此数据类型,它再次存储在map 中,如下所示:

struct A {
    int x;
    Y y;
    A() {};
    A(int _x, Y _y) { x=_x, y=_y; };
};

typedef std::vector<A> LA;
typedef std::map<uint,LA> MB;

MB b;

当我尝试使用迭代器时,例如

std::vector<LA>::iterator it = b[x].begin();

编译器给出了这个错误:

错误:从 '__wrap_iter' 到没有可行的转换 '__wrap_iter > *>' std::vector::iterator it = b[x].begin();

候选构造函数(隐式复制构造函数)不可行:没有从 'iterator'(又名 '__wrap_iter')到 'const std::__1::__wrap_iter std::__1::allocator > *> &' 用于第一个参数 class__wrap_iter

候选构造函数(隐式移动构造函数)不可行:没有已知的从“迭代器”(又名>“__wrap_iter”)到“std::__1::__wrap_iter<:__1::vector> std::__1::allocator > *> &&' 用于第一个参数 class__wrap_iter

候选模板被忽略:被“enable_if”禁用

这个错误的原因是什么?尽管我尝试了几种操作符重载之类的方法,但我无法解决这个问题。任何帮助表示赞赏。

【问题讨论】:

  • 建议:LA::iterator it = b[x].begin();
  • @paulsm4:我已经说过了。在答案部分。它属于哪里!

标签: c++ vector struct iterator


【解决方案1】:

你没有LA的向量;你有一个A 的向量。所以:

std::vector<A>::iterator it = b[x].begin();

或:

LA::iterator it = b[x].begin();

对我来说似乎是一个简单的错字?

(考虑到这些可怕的类型名称,这并不奇怪......)

【讨论】:

  • 感谢您的回答。这很好用!如此简单的解决方案。
【解决方案2】:

这里的其他人已经回答了编译器抱怨的原因。

所以我不会重复,而是给出一个替代的“修复”。仅当您可以在项目/环境中使用 C++11 语法时,它才会起作用。

如果是这样,迭代器可以创建如下:

auto it = b[x].begin();

这不像为it 指定确切类型时那样明确,但至少它的输入更少。请注意,这只适用于 C++11 或更高版本,您需要在 g++ 中使用 -std=c++11 进行编译。 Visual Studio 2013 及更高版本将立即理解该语法。

【讨论】:

    【解决方案3】:

    std::vector&lt;&gt;&lt;&gt; 内部的部分是向量将要保存的对象的类型,例如,std::vector&lt;int&gt;std::vector&lt;double&gt;。在您的情况下,向量中对象的 typeA。所以你应该写

    std::vector<A>::iterator it = b[x].begin();
    

    或使用您的typedef

    LA::iterator is = b[x].begin();
    

    【讨论】:

    • 你说的不是我写的。
    • 我认为 OP 知道向量是什么是相当清楚的,但是没关系
    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多