【问题标题】:How to correctly return std::type_info from class method in C++如何从 C++ 中的类方法正确返回 std::type_info
【发布时间】:2016-12-07 00:37:38
【问题描述】:

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

任何想法我在这里缺少什么?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    这个问题与模板无关,这是因为type_info 是不可复制的。您需要的每个 type_info 对象都已编译到您的程序中,typeid() 不会创建新对象,它会返回对现有对象的 const 引用。

    你应该让你的GetBeliefType 函数通过const 引用返回:

    const std::type_info& GetBeliefType() const override
    

    【讨论】:

    • 那句话是错误的。如果typeid() 构造了一个新对象,那将是正确的,但事实并非如此。它返回引用的对象在程序的整个生命周期内都存在。
    • 谢谢,这对我有用。对于记录:我需要返回一个 const 引用,如下所示:const std::type_info&amp; GetBeliefType() const override
    • 没问题。我已经编辑了答案以添加 const 关键字。
    【解决方案2】:

    如果你看看this document,你会发现

    type_info 类既不是 CopyConstructible 也不是 ...

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

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

    typeid 表达式是左值表达式,它引用具有静态存储持续时间、多态类型 const std::type_info 或从它派生的某种类型的对象。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多