当为特定类型特化模板时,泛型类与 bang 一起使用,使用与泛型相同的方法定义的特化在使用此方法时会引发未解决的外部符号错误。那些。有一堂课
template <typename CMD>
class Version
{
public:
Version(ByteVector &byteVector) : byteVector(byteVector) {};
Object<DATA<CMD>> cls_DATA();
Object<USR<CMD>> cls_USR();
Object<AUTH<CMD>> cls_AUTH();
Object<CONN<CMD>> cls_CONN();
private:
ByteVector &byteVector;
};
以及在同一个 .h 文件中实现 cls_AUTH() 方法
template<typename CMD>
inline Object<AUTH<CMD>> Version<CMD>::cls_AUTH()
{
return Object<AUTH<CMD>>(byteVector);
}
同一文件中有一个特化,不同之处在于此版本中只有一种方法可用
template <>
class Version<AOPEN>
{
public:
Version(ByteVector &byteVector) : byteVector(byteVector) {};
Object<AUTH<AOPEN>> cls_AUTH();
private:
ByteVector &byteVector;
};
因此,在专门化中使用此方法时,会出现未解析的外部符号。并且当您尝试第二次定义该方法时,为了特化,第一个错误仍然存在,第二个错误出现 - 不是可以在此方法的专门定义中显式特化的实体。
两个类 - 两个定义。您不能只为一个类定义一个函数并将该定义用于不同类中的声明。因此,要在不同的类中使用相同的实现,您必须要么使用继承,要么使用自由函数,要么使用组合。继承的时候,我觉得一切都清楚了。具有自由功能的解决方案如下所示:
组合也是一样,只是函数属于某个类,你的类会有这个类的对象,但本质不变。
PS继承将是最简单的,tk。写作会少很多。
您需要覆盖该方法,但不是这样:
并且
template<>一开始没有。也就是说,为了简单起见: