无法返回具有派生类型的std :: unique_ptr <>

时间:2019-09-01 04:51:43

标签: c++ inheritance unique-ptr

我具有以下模板化功能:

template<typename T = CRecordset>
std::unique_ptr<T> ExecuteSqlQuery(LPCTSTR pszSqlQuery = nullptr, RecordsetMode nMode = RecordsetMode::read)
{
    ASSERT(m_Database.IsOpen());
    std::unique_ptr<ITableRecordset> prs = std::make_unique<T>(&m_Database);
    if (!ExecuteSqlQuery(prs.get(), pszSqlQuery, nMode))
        prs.reset();
    return prs;
}

我这样称呼它:

auto prs = db.ExecuteSqlQuery<CCustomerRecordset>(nullptr, RecordsetMode::bulkRead);

CCustomerRecordset源自CTableRecordset<>,而CTableRecordset<>源自ITableRecordset

但是,函数中的return语句给我一个错误:

Error C2440 'return': cannot convert from std::unique_ptr<ITableRecordset,std::default_delete<_Ty>>' to 'std::unique_ptr<CCustomerRecordset,std::default_delete<_Ty>>'  
    with  
    [  
        _Ty=ITableRecordset  
    ]  
    and  
    [  
        _Ty=CCustomerRecordset  
    ]

由于CCustomerRecordsetITableRecordset的一种,为什么我不能这样做?

1 个答案:

答案 0 :(得分:2)

您的示例简化为:

struct A {};
struct B : A {};

A *a = new B;
B *b = a;

return语句试图返回unique_ptr<ITableRecordset>所在的unique_ptr<CCustomerRecordset>。这是一个沮丧,不会暗中发生。解决该问题的方法是在整个功能模板中充分利用具体类型。因此,而不是转换为接口:

auto prs = std::make_unique<T>(&m_Database);