我有以下模板化函数:
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<ITableRecordset>
,其中应包含unique_ptr<CCustomerRecordset>
。这是一个沮丧,不会暗中发生。解决该问题的方法是在整个功能模板中充分利用具体类型。因此,而不是转换为接口(interface):auto prs = std::make_unique<T>(&m_Database);