我有一个类模板,应该能够通过 std::type_info
返回其模板类型:
template <class factType>
class Belief : public BeliefRoot
{
/* ... */
factType m_Fact;
std::type_info GetBeliefType() const override
{
return typeid(m_Fact);
}
};
但是编译该类给我以下错误:
错误c2280:'type_info :: type_info(const type_info&amp;)':尝试引用删除函数
有什么想法我在这里缺少什么?
问题与模板无关,这是因为type_info
是不可复制的。您需要的每个type_info
对象都已编译到您的程序中,并且typeid()
不会制作新对象,它将返回对现有的const引用。
您应该通过const
参考:
GetBeliefType
函数返回 const std::type_info& GetBeliefType() const override
如果您查看此文档,您会发现
type_info
类既不是CopyConstruct也是...
因此,您无法返回其副本。错误消息告诉您同一件事,因为type_info::type_info(const type_info &)
确实是您尝试使用的不存在复制构造函数。
解决方案:您可以返回参考。这是因为
TypeID表达式是LVALUE表达式,它是指具有静态存储持续时间的对象,即多态类型const std :: type_info或某种从其得出的类型的对象。