我不得不为一些旧的,写得不好的代码添加新功能。有50个不同的列表需要在屏幕上显示和处理,并且它们的当前代码都是剪切和粘贴,只需要对两种不同类型进行微小修改,一个是DAO数据库中的列表,另一个是映射中的列表。
我写了一个Search类,它提供了每个列表类型的功能和帮助类,以提供搜索所需的基本功能。 map helper类只需要访问tstring Key,它不需要differentObject Values。但是,我无法将其编译。
由于各种不同的对象没有关系,我定义了一个基本上为空的类SearchValue,并将它作为所有differentObject类的超类添加到.h中。
举个例子,这是一个地图定义:
typedef map<tstring, MyPatListEntry *, tstringcomp> patlist;
定义了MyPatListEntry:
class MyPatListEntry : public SearchValue {
我将函数定义为:
ListHelper(map<tstring, SearchValue *> *map, CString fieldName)
编译器(VC ++)给出的错误是ListHelper()的所有定义都不处理所有参数。如果我在编译工作的定义中用MyPatListEntry替换SearchValue,那么基本格式是正确的。
我在网站上环顾四周,发现人们建议用功能模板完成这类事情,我想这样可行,但我很好奇是否有某种原因这样做是不行的。< / p>
感谢您的任何想法。
答案 0 :(得分:3)
你要求的是在C#世界中被称为协变泛型类型参数(在C ++中不可能),甚至它在你的情况下也不会起作用。原因其实很简单。
想象一下以下代码:
class B {};
class D1 : public B {};
class D2 : public B {};
map<string, D1 *> myMap;
D2 someObject;
void myFunc(map<string, B *> & someMap)
{
someMap["foo"] = &someObject;
}
由于此问题,您无法以myFunc
作为参数调用myMap
。您将被允许将someObject
类型D2
分配到应包含D1
的地图中。
答案 1 :(得分:0)
如果您确实需要ListHelper在不同的SearchValue类型上具有不同的行为,则可以将该函数模板化为地图的值类型:
template <class AnySearchValue> ListHelper(map<tstring, AnySearchValue *> *map, CString fieldName)
如果没有看到更多的实现,很难说这是否可行。 (哎呀抱歉,错过你的OP,你说你考虑过这个)