我具有以下模板化功能:
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
的一种,为什么我不能这样做?
答案 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);