c++ - 模板化静态成员函数所需的语法帮助

标签 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 是正确的......但如果模板函数定义不在 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/

相关文章:

C++ 列表字符获取问题,内存分配错误?

C++ cin 段错误 11

css - 如何在浏览器中调整 div 的大小?

c++模板或+运算符从指针创建 vector

c++ - 模板函数参数的默认值

c++ - 无法将 Glew 与 Cmake 链接

c++ - 使用或不使用指针制作数据成员对象

c++ - 从类型 ‘int&' 的临时类型 'MyClass<int>::iterator*' 的非常量引用的无效初始化

c++ - C++迭代器:实现迭代器类时出错

java - 有合并迭代器实现吗?