我有一堆对象指针容器,我想在不同的上下文中遍历它们以生成诊断信息。我正在为定义函数所需的语法而苦苦挣扎......由于这些对象通过我的应用程序的不同部分进行过滤,因此最好将其封装在专用诊断类中:
// Code sketch only - detail fleshed out below...
class ObjectListDiagnoser
{
public:
static void GenerateDiagnostics( /* help required here! */ );
};
...
// Elsewhere in the system...
ObjectListDiagnoser::GenerateDiagnostics( /* help required here! */ );
我希望能够做的(在我的应用程序中的某些地方)至少是这样的:
std::vector<MyObject *> objGroup1;
std::list<MyObject *> objGroup2;
ObjectListDiagnoser::GenerateDiagnostics( objGroup1.begin(), objGroup1.end() );
ObjectListDiagnoser::GenerateDiagnostics( objGroup2.begin(), objGroup2.end() );
ObjectListDiagnoser::GenerateDiagnostics( objGroup1.rbegin(), objGroup1.rend() );
我曾尝试以两种方式对我的函数进行模板化,但没有成功:
class ObjectListDiagnoser
{
public:
// 1 - nope.
template <class ObjIter>
static void GenerateDiagnostics( ObjIter first, ObjIter last );
// 2. - nope.
template <class Container, class ObjIter>
static void GenerateDiagnostics( Container<MyObject *>::ObjIter first,
Container<MyObject *>::ObjIter last );
};
有人可以为此提供正确的语法吗?容器类型会有所不同,迭代方向也会有所不同,但始终针对同一类型的对象。
下面评论中的讨论摘要 - 情况 1 是正确的......但如果模板函数定义不在 header 中,则会导致广泛难以理解的链接器错误。模板函数定义只需放在标题中——这一点很容易被遗忘。将它放入标题中,一切都很好 - 编译、链接……甚至希望能运行。
最佳答案
您应该使用选项 1。与 <algorithm>
中的函数一样, 容器类型不属于模板参数。
我们需要有关问题所在的更多信息。你应该没问题……你只需要添加定义。
template <class ObjIter>
static void ObjectListDiagnoser::GenerateDiagnostics
( ObjIter first, ObjIter last ) {
…
}
编辑:与所有模板一样,此定义需要放在头文件中。广泛不支持在其定义的源文件之外使用模板。
您可以使用显式实例化,它允许在非头文件中实现,但否定了使用模板的一些好处:您只能使用显式实例化的模板参数。
// implementation in source file
template <class ObjIter>
static void ObjectListDiagnoser::GenerateDiagnostics
( ObjIter first, ObjIter last ) {
…
}
template void ObjectListDiagnoser::GenerateDiagnostics
< std::list<Object>::iterator >
( std::list<Object>::iterator first, std::list<Object>::iterator last );
template void ObjectListDiagnoser::GenerateDiagnostics
< std::vector<Object>::iterator >
( std::vector<Object>::iterator first, std::vector<Object>::iterator last );
// now you can only use vector<Object>::iterator or list<Object>::iterator
// as arguments.
关于c++ - 模板化静态成员函数所需的语法帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497158/