我有一堆对象指针容器,我想在不同的上下文中迭代以产生诊断。我正在努力使用定义函数所需的语法...由于这些对象通过我的应用程序的不同部分进行过滤,因此最好将其封装在专用的诊断类中:
// 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是正确的......但如果模板函数定义不在标题中,则会导致广泛无法理解的链接器错误。模板函数定义只需要进入标题 - 这一点很容易被遗忘。将它滑入标题,一切都很好 - 编译,链接......甚至可以运行。
答案 0 :(得分:1)
您应该使用选项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.
答案 1 :(得分:0)
我同意@sth没有问题1.事实上,STL算法被声明为引用 - find
如果1有效,则不需要2.声明应该是
的任何方式template <class Container>
static void GenerateDiagnostics( typename Container<MyObject *>::iterator first,
typename Container<MyObject *>::iterator last );
请注意 - 这只是一个适用于容器iterator
的示例,可能不适用于reverse_iterator
或const_iterator