【发布时间】:2018-11-08 15:01:17
【问题描述】:
我正在尝试为 PacketDecoder 创建一个非模板基类,以便可以将 Base* 存储在 std::map 中。解码功能被正确覆盖。编码函数给了我这个错误“'编码'不是虚拟的,不能被声明为纯的”。我可能会认为这个问题来自 Java 背景是错误的。有没有更惯用的 c++ 方法来解决这个问题?
class Base {
public:
virtual Packet* decode(folly::io::Cursor& cursor) = 0;
virtual void encode(Packet* packet) = 0;
};
template<typename T, typename std::enable_if<std::is_base_of<Packet, T>::value>::type* = nullptr>
class PacketDecoder : public Base {
public:
virtual T* decode(folly::io::Cursor& cursor) = 0;
virtual void encode(T *packet) = 0;
};
示例用法:
class TestDecoder : public PacketDecoder<ProxyJoinPacket> {
public:
ProxyJoinPacket *decode(folly::io::Cursor &cursor) override {
uint32_t stringLength;
if (!cursor.tryReadBE<uint32_t>(stringLength)) {
throw std::runtime_error("Failed to read string length");
}
if (cursor.length() < stringLength) {
throw std::runtime_error("Too few bytes for string");
}
auto uuid = cursor.readFixedString(stringLength);
return new ProxyJoinPacket(uuid);
}
void encode(ProxyJoinPacket *packet) override {
}
};
std::vector<Base*> decoders;
void a() {
decoders.insert(new TestDecoder()); // error "Allocating an object of abstract class type 'TestDecoder'"
}
【问题讨论】:
-
提示:使用
override关键字确保派生实际上覆盖了基类方法 -
我也尝试过使用覆盖,它导致了同样的错误。
-
请提供minimal reproducible example。你在哪里实例化
PacketDecoder? -
只有返回类型,否则是新函数
-
我的代码中没有那个错字。我在 SO 编辑器中编辑时不小心添加了它。