gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:26:02 24 4
gpt4 key购买 nike

我有一堆对象指针容器,我想在不同的上下文中遍历它们以生成诊断信息。我正在为定义函数所需的语法而苦苦挣扎......由于这些对象通过我的应用程序的不同部分进行过滤,因此最好将其封装在专用诊断类中:

// 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com