我有一个基类叫做#34; Packet"使用以下方法:
template <typename T>
void write()
{
//DoSomething
writeHandler<T>();
}
和一个名为PacketA的子类,为每个处理程序实现模板spezialisation方法
在PacketA中,我想写一个名为B()的方法,如下面的
public function B() { write<MySpezialisation>(); }
我认为它会调用Packet :: write 我的spezialisation writeHandler
如果我有我的基础班
Packet::write<MySpecialisation>();}
它没有调用我的模板spezialisation方法。
有什么问题?
#ifndef CLIENTIPPACKET_H
#define CLIENTIPPACKET_H
/*INCLUDES SKIPPED*/
class PacketA : public Packet
{
public:
struct MySpecialization
{
};
PacketA() : Packet() {}
private:
template<typename T> void writeHandler();
public:
void write() { Packet::writeHandler<MySpezialisation>(); }
};
template<>
void PacketA::writeHandler<PacketA::MySpecialization>()
{
//DOSOMETHING
}
#endif
答案 0 :(得分:0)
您如何理解Packet
writeHandler()
应该来自PacketA
? writeHandler()
不是虚拟的(并且不能,因为它是模板化的),因此Packet
将始终使用自己的版本。
我可以建议将其重写为
template <typename T, typename P>
void write(T data, P& packet)
{
m_data.clear();
getStream()->atStart();
packet.writeHandler<T>(data);
getStream()->atStart();
}
并在PacketA
public function B() { write<MySpezialisation>(data, *this); }
(您是否忘记了代码中的data
?)
但是,根据您的特定设计需求,可能存在更好的方法。