0

为什么在我的示例中“TArgs”模棱两可?

编译器应该知道唯一存在的函数签名

virtual CGame::NetCreatePlayer(CNetPeer* _pPeer, int _ObjectID, const CNetMessage& _ObjectData, bool _bAuthority); 

TArgs并在此函数中推断正确:

template<typename... TArgs >
void INetInterface<TSubClass>::NetCall(void(TSubClass::*_pFunc)(CNetPeer*, TArgs...), CNetPeer* _pPeer, TArgs... _Params);

我想这样称呼它:

CNetMessage obj;
//...
NetCall(&CGame_Server::NetCreatePlayer, _pClient, 0, obj, true);

CGame_Server 继承 CGame。

编译器输出:

4> error C2782: 'void INetInterface<CGame>::NetCall(void (__thiscall CGame::* )(CNetPeer *,TArgs...),CNetPeer *,TArgs...)' : template parameter 'TArgs' is ambiguous 4> NetInterface.h(82) : see declaration of INetInterface<CGame>::NetCall' 4> could be 'int, const CNetMessage&, bool' 4> or 'int, CNetMessage, bool'

它不能是'int,CNetMessage,bool',对吗?

有没有办法解决这个问题?我尝试投射到const CNetMessage&但奇怪的是这并没有帮助。而且没有其他同名的成员函数。

4

1 回答 1

2
NetCall(&CGame_Server::NetCreatePlayer, _pClient, 0, obj, true);

从这个调用中有两个地方TArgs可以推断:

  • 从成员函数指针的类型,编译器推导出TArgs == int, const CNetMessage&, bool
  • 从参数0, obj, true中,编译器推导出TArgs == int, CNetMessage, bool

结果冲突。要解决此问题,请使用identity技巧将第二个TArgs放入非推断上下文中:

template<class T> struct identity { using type = T; };    
template<class T> using identity_t = typename identity<T>::type;

template<typename... TArgs >
void INetInterface<TSubClass>::NetCall(void(TSubClass::*_pFunc)(CNetPeer*, TArgs...),
                                       CNetPeer* _pPeer, identity_t<TArgs>... params);

作为旁注,_Params是一个保留标识符,_ObjectData以及_ObjectID; 你应该重命名它们。

于 2015-02-18T02:34:33.020 回答