gpt4 book ai didi

c++ - 将具有不同值类型的映射传递给 C++ 中的函数

转载 作者:行者123 更新时间:2023-11-30 03:02:56 25 4
gpt4 key购买 nike

我不得不向一些旧的、写得不好的代码添加新功能。有 50 个不同的列表需要在屏幕上显示和处理,它们的当前代码都是从 2 种不同类型(一种是 DAO 数据库中的列表,另一种是 map 中的列表)中进行少量修改的剪切和粘贴。

我编写了一个提供功能的搜索类,并为每种列表类型编写了一个帮助程序类以提供搜索所需的基本功能。 map 助手类只需要访问 tstring 键,不需要不同的对象值。但是,我无法编译它。

由于各种不同的对象没有关系,我定义了一个基本为空的类 SearchValue,并将其作为所有不同对象类的父类(super class)添加到 .h 中。

例如,这是 map 定义之一:

typedef map<tstring, MyPatListEntry *, tstringcomp> patlist;

MyPatListEntry 定义:

class MyPatListEntry : public SearchValue {

我将函数定义为:

ListHelper(map<tstring, SearchValue *> *map, CString fieldName) 

编译器 (VC++) 给出的错误是 ListHelper() 的所有定义均未处理所有参数。如果我在定义中将 SearchValue 替换为 MyPatListEntry,则编译工作正常,因此基本格式是正确的。

我在网站上四处查看,发现有人建议使用函数模板来完成这种类型的事情,我想这会奏效,但我很好奇是否有某种原因使这种方式无法奏效。

感谢您的任何想法。

最佳答案

您所要求的在 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;
}

由于这个问题,您不能以myMap 作为参数调用myFunc。您可以将 D2 类型的 someObject 分配到应该包含 D1 的 map 中。

关于c++ - 将具有不同值类型的映射传递给 C++ 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9803451/

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