对于我的一个程序,我做了一个小函数来清除我拥有的各种 std::vector 指针。

template <class S>
void clearPtrVector(std::vector<S*> &a,int size)
{
    for(size_t i = 0; i < size; i++)
         delete a[i];

    a.clear();
}

我一定在这里做错了什么,因为当在析构函数中调用这个函数时,如下所示:

clearPtrVector(neurons,neurons.size());

我两次收到以下未定义的引用:

undefined reference to `void clearPtrVector<Neuron>(std::vector<Neuron*,std::allocator<Neuron*> >&, int)'

我不得不承认我不熟悉 std::allocator 是什么,所以我无法猜测这里可能存在什么问题。非常感谢任何帮助。提前致谢!

-莱夫特里斯

有帮助吗?

解决方案

<强>热修复

写入以下代替:

  template <class Vector>
  void clearPtrVector(Vector &a)
  {
    for(size_t i = 0; i < a.size(); i++)
         delete a[i];

    a.clear();
  }

请确保您定义模板的地方在那里编译器可以在每次使用模板前,看到它。如果你没有创建一个声明,你应该是安全的,否则你应该得到一个编译错误。如果你创建任何理由的声明,加倍小心到处包括根据需要定义。

<强>重新设计

这是说,我认为正确的解决办法是重新考虑你的设计和使用的容器,将妥善处理破坏,从而使您不必做手工,这是繁琐的,而且几乎不可能正确地做如果你需要异常安全。使用std::shared_ptr而不是原始指针,或std::auto_ptr用的容器,它能够阻止他们(std::vector不能存储auto_ptr值)。一个可能的解决办法是使用升压指针容器

其他提示

时的头文件的clearPtrVector实现?因为如果它是在一个单独的.cpp文件,链接器将无法找到它。

请确保您有这个功能在头文件(.H,* .HPP),因为如果你在源文件中有原型的头文件中定义它,你会得到一个未定义的引用链接错误。

未定义参考错误意味着编译器已发现该函数的参考,但接头却未能找到该功能的对象之间的文件的参考。任何模板函数具有在头文件中定义,因此编译器将能够把它在任何的源文件,这使得使用的功能。

时不重新设计的一个重复的 的清理-AN-STL一览矢量的指针

<强>备注

如果你不使用智能指针之一,使用的提振:: checked_delete 的功能,而不是删除,以确保你没有删除一个不完整的类型。

我在我的答案提供给你的第一个问题 https://stackoverflow.com/questions/891913?sort=newest 时,一个答案如下:

template <class C> void FreeClear( C & cntr ) {
    for ( typename C::iterator it = cntr.begin(); 
              it != cntr.end(); ++it ) {
        delete * it;
    }
    cntr.clear();
}

,其适用于所有类型的容器。请注意,该尺寸参数没有提供,但是从收集obrtained - 这是设计这样的功能以正确的方式,提供所述尺寸作为一个单独的值只能导致灾难

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top