【问题标题】:deleting vector or pointers compiler error删除向量或指针编译器错误
【发布时间】:2013-07-19 19:05:13
【问题描述】:

我有以下功能, 以前可以正常工作,但是,我不知道我做了什么,我开始得到一些奇怪的错误

容器是一个指针向量

template<typename Container>
void delete_collections(Container& c) 
{ 
    while(!c.empty()) 
    {
        delete c.back(); //<=== here
        c.back() = NULL;
        c.pop_back();    //<=== & here
    }
}

第一个错误

**此行有多个标记

  • (每个未声明的标识符都是
  • `back' 未声明(首先使用这个

第二个错误

  • `pop_back' 未声明(首次使用

解决方案 我曾经错误地将映射传递给函数,但我希望编译器给出任何警告。

【问题讨论】:

  • Container 的实际类型是什么?
  • 我发送一个指针向量
  • 看起来您使用没有 back() 和 pop_back() 方法的 Container 实例化了模板化类。
  • 适用于我的矢量。 see
  • whole 错误信息怎么样?也就是说,这将适用于 vector、deque 和 list,但不适用于 map、set 及其无序/多变体。顺便说一句,NULL 的赋值是不必要的。

标签: c++ pointers vector compiler-errors


【解决方案1】:

为了记录,我会改用专门的容器,看看例如促进。或者,将智能指针存储在您不必手动调用delete 的位置。不过,这里是如何以一种适用于除地图之外的每个容器的方式来实现的:

template<typename container>
void delete_all(container& c) {
    for(typename container::const_iterator it=c.begin(), end=c.end(); it!=end; ++it)
        delete *it;
    c.clear();
}

对于 C++11,您也可以使用 auto,而不是 typename container::const_iterator

【讨论】:

  • C++11 让它变得简单! for(const auto&amp; v : c) delete v; c.clear();
  • @abdul 澄清一下,问题是你没有取消引用你的迭代器,所以你试图删除你的迭代器,这不是一个指针,你不能这样做。但是,是的,使用 std::unique_ptrs 的容器,它还有一个额外的好处,当你擦除东西时也可以工作。
  • 我不认为这是问题所在,而是他在他的模板函数中假设了一个无序序列接口。当用例如实例化时map,接口不存在,所以无法编译。
猜你喜欢
  • 2013-04-14
  • 2020-07-26
  • 1970-01-01
  • 2013-09-24
  • 2012-08-12
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多