指针模板清除功能的向量无法使用"未定义的引用"消息进行编译

Lef*_*ris 0 c++ templates stl stdvector

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

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

    a.clear();
}
Run Code Online (Sandbox Code Playgroud)

我必须在这里做错了,因为在析构函数中调用此函数是这样的:

clearPtrVector(neurons,neurons.size());
Run Code Online (Sandbox Code Playgroud)

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

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

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

-Lefteris

Sum*_*uma 8

热修复

写下来:

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

    a.clear();
  }
Run Code Online (Sandbox Code Playgroud)

确保在每次使用模板之前将模板定义在编译器可以看到的位置.如果您不创建声明,则应该是安全的,否则您将收到编译错误.如果您确实因任何原因创建了声明,请仔细检查以根据需要随处包含定义.

重新设计

也就是说,我认为正确的解决方案是重新考虑你的设计,并使用一个能够正确处理破坏的容器,这样你就不必手动完成,这很乏味,而且如果你需要的话几乎不可能做到正确异常安全.使用std::shared_ptr而不是原始指针,或std::auto_ptr使用能够容纳它们的容器(std::vector不能存储auto_ptr值).一种可能的解决方案是使用Boost指针容器

  • 永远不要创建auto_ptrs的向量.看看Scott Mayers的"Effective STL -Revised",了解其背后的原因. (3认同)
  • 这个答案有错误的推理.无论你编写`std :: vector <A>`还是`std :: vector <A,std :: allocator <A >>>都不重要,因为分配器的放置方式与默认参数完全相同.发生实际链接错误的原因是标题中没有定义.naveen解释说,"重新设计"章节也包含错误的建议.请更正这些问题. (2认同)