如何在C++中从类方法正确返回std::type_info

5

我有一个类模板,它应该能够通过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 &)': 尝试引用已删除的函数

你们有什么想法吗?我是漏掉了什么吗?

2个回答

5
问题与模板无关,它是由于type_info不可复制引起的。每个您需要的type_info对象已经编译到您的程序中,并且typeid()不会创建新对象,而是返回对现有对象的const引用。
您应该使您的GetBeliefType函数通过const引用返回:
const std::type_info& GetBeliefType() const override

1
那个语句是错误的。如果 typeid() 构造了一个新对象,它将是正确的,但实际上并没有这样做。它返回的对象引用在程序的生命周期内保持不变。 - IanPudney
谢谢,这对我很有帮助。记录一下:我需要返回一个const引用,像这样:const std::type_info& GetBeliefType() const override - Matthias
没问题。我已经编辑了我的答案,添加了 const 关键字。 - IanPudney

0
如果您查看此文档,您会发现

type_info类既不可复制也不可构造...

因此,您无法返回其副本。错误消息告诉您同样的事情,因为type_info::type_info(const type_info &)是您尝试使用的不存在的复制构造函数。
解决方案:您可以返回引用。这是因为

typeid表达式是一个左值表达式,它引用具有静态存储期的对象,该对象是多态类型const std::type_info或从中派生的某些类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接