模板化静态成员函数需要语法帮助

时间:2010-03-23 02:22:07

标签: c++ templates iterator

我有一堆对象指针容器,我想在不同的上下文中迭代以产生诊断。我正在努力使用定义函数所需的语法...由于这些对象通过我的应用程序的不同部分进行过滤,因此最好将其封装在专用的诊断类中:

// 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是正确的......但如果模板函数定义不在标题中,则会导致广泛无法理解的链接器错误。模板函数定义只需要进入标题 - 这一点很容易被遗忘。将它滑入标题,一切都很好 - 编译,链接......甚至可以运行。

2 个答案:

答案 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_iteratorconst_iterator