【发布时间】:2017-04-07 08:22:34
【问题描述】:
我有以下功能
SlabWallConnectionEvent* createObservedEvent(SlabWallConnectionEvent::Data* pEventData)
{
assert(pEventData != nullptr);
return SlabWallConnectionEvent::create(pEventData->m_wall, pEventData->m_slab);
}
然后我可以使用模板规范制作更通用的模板。
.h 文件
template <class ObservedEventType, class ObservedEventDataType>
void createObservedEvent(ObservedEventType*& pEvent,ObservedEventDataType* pEventData);
.cpp 文件
template<>
void createObservedEvent<SlabWallConnectionEvent, SlabWallConnectionEvent::Data>
(SlabWallConnectionEvent*& pEvent, SlabWallConnectionEvent::Data* pEventData)
{
assert(pEventData != nullptr);
pEvent = SlabWallConnectionEvent::create(pEventData->m_wall, pEventData->m_slab);
}
这对我来说非常有效,但我对原始指针的引用不太满意。是否可以将其更改为以下内容:
.h 文件
template <class ObservedEventType, class ObservedEventDataType>
ObservedEventType* createObservedEvent(ObservedEventDataType* pEventData);
.cpp 文件
template<>
SlabWallConnectionEvent* createObservedEvent<SlabWallConnectionEvent, SlabWallConnectionEvent::Data>
(bim_ui::SlabWallConnectionEvent::Data* pEventData)
{
assert(pEventData != nullptr);
return bim_ui::SlabWallConnectionEvent::create(pEventData->m_wall, pEventData->m_slab);
}
当我尝试使用它时,出现以下错误:
Error 1 error C2783: 'ObservedEventType
*createObservedEvent(ObservedEventDataType *)' : could not deduce template
argument for 'ObservedEventType'
编辑
我在模板函数中使用这个函数
template <class ObservedEventType>
void CmdBimDrag::observeConnectionEvent(ObservedEventData* pObservedEvent){
...
if (pCurrentEvent == nullptr)
createObservedEvent(pCurrentEvent, pEventData);
...
}
然后这个函数就这样被调用了
observeConnectionEvent<SlabWallConnectionEvent>((*pObservedEventData).get());
编辑2
Jonas' answers 第一部分工作只需指定模板类型就足够了:
createObservedEvent<SlabWallConnectionEvent>(pEventData);
但是使用 auto 似乎并不能保证删除返回类型规范:
.h 文件
template <class ObservedEventType, class ObservedEventDataType>
auto createObservedEvent(ObservedEventDataType* pEventData) -> ObservedEventType*;
.cpp 文件
template<>
auto createObservedEvent<SlabWallConnectionEvent, SlabWallConnectionEvent::Data>
(SlabWallConnectionEvent::Data* pEventData) -> SlabWallConnectionEvent*
{
assert(pEventData != nullptr);
return SlabWallConnectionEvent::create(pEventData->m_wall, pEventData->m_slab);
}
此代码使用模板规范编译,但只是调用:
createObservedEvent(pEventData);
仍然给出无法推断类型的第一个错误。
【问题讨论】:
-
见link
-
由于无法从调用位置确定第一个模板参数(它仅用作返回类型),因此您需要在调用函数时明确指定该模板参数。
-
第二种解决方案的调用将是
auto* pEvent = createObservedEvent<ObservedEventType>(pEventData)而不是createObservedEvent(&pEvent , pEventData);。
标签: c++