我有以下模板化函数:

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的一种,为什么我不能这样做呢?

最佳答案

您的示例简化为:

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

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

return语句试图返回一个unique_ptr<ITableRecordset>,其中应包含unique_ptr<CCustomerRecordset>。这是一个沮丧,不会暗中发生。解决该问题的方法是在整个功能模板中充分利用具体类型。因此,而不是转换为接口(interface):
auto prs = std::make_unique<T>(&m_Database);

10-08 11:05