c++ - 指针模板清除函数的 vector 无法编译并显示 "undefined reference"消息

标签 c++ templates stl stdvector

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

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 :

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 值)。一种可能的解决方案是使用 Boost Pointer Container

关于c++ - 指针模板清除函数的 vector 无法编译并显示 "undefined reference"消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/914460/

相关文章:

c++ - 在 C++ 中返回 float 组

C++:如何要求一种模板类型派生自另一种

c++ - gcc4 模板错误或更可能是 id10t 错误

c++ - 有人可以在 C++ 中解释 { } 容器吗

c++ - 是否有任何C++函数对哈希表进行排序?

c++ - 对于任意精度,是否有普遍接受的 GMP 替代方案?

C++ 将引用变量传递给 g++-4.7.4 中的线程

c# - 在 C# 中使用 webkit 库的问题

c++ - 将命名参数用于模板模板参数是否有任何用途

c++ - 将第三个参数传递给 C++(STL) 的排序函数