c++ - std::vector::erase(item) 需要为项目定义赋值运算符?

标签 c++ visual-studio-2012 operators stdvector

我有一个类C没有定义 operator= .我正在尝试使用这样的 vector :std::vector<std::pair<C,D>> vec; .现在,我的问题是完成后我无法删除这对。编译器提示缺少 operator=对于 C .我不能有一个没有这个运算符的类的 vector 吗?我该如何解决这个问题?我无法将作业添加到 C .这是我得到的错误:

error C2582: 'operator =' function is unavailable in 'C'    C:\...\include\utility  196 1   my-lib

这是我的代码:

void Remove(const C& c) 
{
    auto i = cs_.begin();
    while( i != cs_.end()) {
        if (i->first == c) {
            cs_.erase(i);  // this is the problem
            break;
        }
        i++;
    }
 }

哪里cs_是:

std::vector<std::pair<C,D>> cs_;

最佳答案

原因是如果你删除一个不同于std::vector::end()的位置,删除将重新分配你的对象。 .重新分配意味着复制。

请注意,不可复制类型的 vector 只能部分使用。在我们有emplace()之前(pre-C++11) 这甚至是不可能的。如果你的类是可复制的,那你为什么不定义一个赋值运算符呢?

解决方法可以是智能指针(或普通指针) vector ,如 std::vector<std::unique_ptr<C>>

关于c++ - std::vector::erase(item) 需要为项目定义赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21310646/

相关文章:

c++ - Qt 中的长线

c++ - 递归调用模板函数 (C++)

windows-xp - VS2012 ClickOnce 应用程序无法在 Windows XP 上运行

java - 在字符串数组中搜索字符串

c++ - 冒号是什么意思(:) operator in "uint isWidget : 1;" in Qt?

Java : Operators and Typecasting

C++ 迭代器从 typedef std::map 声明为模板参数

c++ - 与指向数组的指针 union

c++ - 资源窗口在其他系统上无法正常工作 (Visual Studio 2012)

visual-studio-2012 - WIX 生成多语言安装程序