【发布时间】:2010-03-23 02:22:06
【问题描述】:
我有一堆对象指针容器,我想在不同的上下文中对其进行迭代,以便为它们生成诊断信息。我正在为定义函数所需的语法而苦苦挣扎……由于这些对象通过我的应用程序的不同部分进行过滤,因此最好将其封装在一个专用的诊断类中:
// 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 );
};
有人可以为此提供正确的语法吗?容器类型会有所不同,迭代的方向也会有所不同,但总是针对相同类型的对象。
以下 cmets 中的讨论摘要 - 案例 1 是正确的...但如果模板函数定义不在标头中,则会导致广泛无法理解的链接器错误。模板函数定义只需放在标题中 - 很容易忘记这一点。将其滑入标题中,一切都很好 - 编译、链接……甚至可以运行。
【问题讨论】:
-
案例 1 有什么问题?据我所知,这应该没问题。
-
旁注:在 C++ 中,不需要类来分组函数,而是使用命名空间。
-
@gf:该对象可能有用地保存诸如流或格式首选项之类的东西。
-
写错了,"如果你只想对函数进行分组"。
-
@sth - sase 1 导致我出现链接器错误。看来我调用函数的方式不足以让编译器将函数与其拥有的模板匹配。我可以将不可编译的代码放入函数定义的主体中,并且它永远不会引发编译器错误......也许我需要按照下面的 Yogesh 在某处输入一个或两个“类型名”? @gf - 我正在分组为一个类进行格式化,正如 Potatoswatter 猜测的那样。