关于c ++ 11:如何从C ++中的类方法正确返回std :: type_info

How to correctly return std::type_info from class method in C++

我有一个类模板,它应该能够通过std::type_info返回其模板类型:

1
2
3
4
5
6
7
8
9
10
11
12
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&;)":试图引用已删除的函数

你知道我这里缺少什么吗?


这个问题与模板无关,这是因为type_info是不可复制的。您需要的每个type_info对象都已经编译到您的程序中,并且typeid()没有生成新的对象,它返回对现有对象的常量引用。

您应该通过const引用使您的GetBeliefType函数返回:

1
const std::type_info& GetBeliefType() const override


如果你看一下这份文件,你会发现

The type_info class is neither CopyConstructible nor ...

因此,您不能退回副本。错误消息告诉您同样的事情,因为type_info::type_info(const type_info &)实际上是您试图使用的不存在的复制构造函数。

解决方案:您可以返回引用。这是因为

The typeid expression is lvalue expression which refers to an object with static storage duration, of the polymorphic type const std::type_info or of some type derived from it.