无法返回派生类型的标准::unique_ptr<>

Can't return std::unique_ptr<> with derived type

本文关键字:返回 ptr lt gt unique 类型 标准 派生      更新时间:2023-10-16

我有以下模板化函数:

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  
]

既然CCustomerRecordset是一种ITableRecordset,为什么我不能这样做呢?

您的示例简化为:

struct A {};
struct B : A {};
A *a = new B;
B *b = a;

return 语句正在尝试返回预期unique_ptr<CCustomerRecordset>unique_ptr<ITableRecordset>。这是一个沮丧的,不会隐含地发生。解决此问题的一种方法是在整个函数模板中充分利用具体类型。因此,而不是转换为界面:

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