指针向量模板清除函数无法编译并显示“未定义引用”消息
题
对于我的一个程序,我做了一个小函数来清除我拥有的各种 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文件,链接器将无法找到它。
一些东西:
在您的原始代码中,不要传递尺寸;只需从向量中获取它:
template <class S>
void clearPtrVector(std::vector<S*> &a)
{
for(size_t i = 0; i < a.size(); ++i)
{
delete a[i];
}
a.clear();
}
其次,只需传入向量本身,而不是它指向的类型:
template <class Vector>
void clearPtrVector(Vector &vec)
{
for(size_t i = 0; i < vec.size(); ++i)
{
delete vec[i];
}
vec.clear();
}
第三,该错误听起来像是您将其放置在 .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 - 这是设计这样的功能以正确的方式,提供所述尺寸作为一个单独的值只能导致灾难