地图'Cannot convert from _Ty2 to T*'错误



我想从 std::map 返回一个元素作为指针,但我不断收到此错误并且找不到解决它的方法。

map 的第二个元素是指向 IService 的指针,getService 的返回是指向 T 的指针,这是一个 IService,所以我不明白为什么会出现此错误。

// Locator.h
template <class T>
class Locator
{
public:
static T* getService(ServiceType serviceType);
static void provide(ServiceType serviceType, T* service);
private:
static std::unordered_map<ServiceType, IService*> _services;
};
// Locator.cpp
template <class T>
T* Locator<T>::getService(ServiceType serviceType)
{
for (auto itr = _services.find(serviceType); itr != _services.end(); itr++)
{
return itr->second;
}
}
//IService.h
class IService
{
public:
virtual void start() = 0;
virtual void stop() = 0;
virtual void update() = 0;
};
  1. for 循环毫无意义 - 第一个匹配项将打破它并返回。
  2. 返回值缺少强制转换 - 映射包含与返回类型 T* 无关的 IService 指针,除了 T* 是 IService 的基础(但看起来不像是有意的(。动态强制转换可以在 IService 是多态类型并且包含的映射元素支持转换为 T* 的情况下解决它。

所以试试:

template <class T>
T* Locator<T>::getService(ServiceType serviceType)
{
auto itr = _services.find(serviceType);
return itr != _services.end() ? dynamic_cast<T*>(itr->second) : nullptr;
}

并且不要忘记为静态映射添加变量(在 cpp 中的某个地方(:

std::unordered_map<ServiceType, IService*> Locator<ServiceImpl>::_services;

最新更新