【问题标题】:no match for operator= using a std::vector不匹配 operator= 使用 std::vector
【发布时间】:2010-06-14 23:40:43
【问题描述】:

我有一个这样声明的类:

class Level
{
    private:
        std::vector<mapObject::MapObject> features;
    (...)
};

在它的一个成员函数中,我尝试像这样遍历该向量:

vector<mapObject::MapObject::iterator it;
for(it=features.begin(); it<features.end(); it++)
{
    /* loop code */
}

这对我来说似乎很简单,但是 g++ 给了我这个错误:

src/Level.cpp:402: error: no match for ‘operator=’ in ‘it = ((const yarl::level::Level*)this)->yarl::level::Level::features.std::vector<_Tp, _Alloc>::begin [with _Tp = yarl::mapObject::MapObject, _Alloc = std::allocator&lt;yarl::mapObject::MapObject&gt;]()’
/usr/include/c++/4.4/bits/stl_iterator.h:669: note: candidates are: __gnu_cxx::__normal_iterator&lt;yarl::mapObject::MapObject*,std::vector > >& __gnu_cxx::__normal_iterator&lt;yarl::mapObject::MapObject*,std::vector > &gt;::operator=(const __gnu_cxx::__normal_iterator&lt;yarl::mapObject::MapObject*, ``std::vector&lt;yarl::mapObject::MapObject, std::allocator&lt;yarl::mapObject::MapObject&gt; &gt; &gt;&amp;)

有人知道为什么会这样吗?

【问题讨论】:

  • 你的意思是vector&lt;mapObject::MapObject&gt;::iterator it;?你在这里错过了一个尖括号。
  • C++ 的错误信息看起来像是呕吐物与更多的呕吐物混合在一起,并整齐地放在尖括号内。
  • @Aviral:我不经常使用 g++,但其他编译器(即使用 EDG 前端的 Visual C++ 和 Intel C++)有模板错误消息much 比这更容易阅读,IMO。

标签: c++ stl vector constants


【解决方案1】:

我猜这部分错误描述了您的问题:

(const yarl::level::Level*)this

此代码所在的成员函数是 const 限定的成员函数吗?如果是这样,您需要使用const_iterator

vector<mapObject::MapObject>::const_iterator it;

如果成员函数是 const 限定的,则只有成员向量上的 begin()end() 的 const 限定重载可用,并且它们都返回 const_iterators。

【讨论】:

  • 这就是问题所在。感谢您的帮助。
【解决方案2】:

您是否在此处关闭了直角括号?

vector<mapObject::MapObject::iterator it;

如果你想要一个对象向量,你的对象需要一个 operator=。 MapObject 有吗?如果不是,请考虑指向 MapObject 的指针向量。

【讨论】:

  • 错误来自分配迭代器,而不是分配向量中的对象。如果无效行实际上是vector&lt;MapObject::iterator&gt; it;,您可能会收到此错误,这是有效但错误的。应该是vector&lt;MapObject&gt;::iterator it;
  • 请注意,除非您明确声明复制赋值运算符,否则编译器会为您提供一个,因此即使您在类定义中看不到一个,它仍然有一个。
【解决方案3】:

如果我是你,我会检查 mapObject::MapObject 是否有一个默认构造函数和一个公共赋值运算符。

在类标题的某处,您应该会看到如下内容:

public:
    MapObject();
    operator=(const MapObject &mapObject);

这意味着该类有一个默认构造函数和一个赋值运算符。

一个 std::vector 不能使用一个没有默认构造函数的类来实例化,并且你不能像上面那样在没有赋值运算符的情况下遍历这个类。

因此,将赋值运算符添加到您的类定义中,您的迭代将编译。

【讨论】:

  • std::vector 可以为没有默认构造函数的类型实例化,你只是失去了一些功能(例如,当你调整向量的大小时,你必须提供要复制到新插槽中的对象)。
【解决方案4】:

@James McNellis 的回答(“绿色检查”最佳答案)用类似的描述修复了我的错误,但是我的错误是由@tmarthal 提到他的回答帖子(未定义赋值运算符)引起的。他建议的解决方法是包含一个赋值运算符,但我只是想补充一点,我也可以通过对没有赋值的类使用 std::vector::const_iterator 而不是 std::vector::iterator 来修复这个错误运算符已定义。我不确定这是否真的是一个正确的修复,或者只是让编译器不会抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多