[英]Default template type gives error but explicit type does not
我的CCustomerBulkRecordset
类声明如下:
template <class T = CRecordsetEx>
class CCustomerBulkRecordset : public T
{
// Member declarations
};
我的CRemoteDatabase
类中有一个方法如下:
template<typename T = CRecordset>
std::unique_ptr<T> ExecuteSqlQuery(LPCTSTR pszSqlQuery, UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, DWORD dwOptions = CRecordset::none)
{
// ...
}
我可以使用以下代码来调用该方法,它可以正常工作。
CRemoteDatabase db;
db.Open();
auto prs = db.ExecuteSqlQuery<CCustomerBulkRecordset<CRecordset>>(NULL, CRecordset::forwardOnly, CRecordset::useMultiRowFetch);
但是下面的代码给了我一个编译错误。
CRemoteDatabase db;
db.Open();
auto prs = db.ExecuteSqlQuery<CCustomerBulkRecordset>(NULL, CRecordset::forwardOnly, CRecordset::useMultiRowFetch);
错误C2672'CDatabaseCommon :: ExecuteSqlQuery':找不到匹配的重载函数
错误C3206'CDatabaseCommon :: ExecuteSqlQuery':'T'的无效模板参数,类模板'CCustomerBulkRecordset'上缺少模板参数列表
唯一的区别是,我没有在第二个中指定CCustomerBulkRecordset
类型名称。 但是由于它默认为CRecordset
,所以两个版本不应该一样工作吗?
在
template<typename T = CRecordset>
std::unique_ptr<T> ExecuteSqlQuery(...)
T
是模板参数。 这意味着必须将其推导为单个类型,或显式提供一个类型。 当你做
auto prs = db.ExecuteSqlQuery<CCustomerBulkRecordset<CRecordset>>(...);
您给它类型CCustomerBulkRecordset<CRecordset>
。 当你做
auto prs = db.ExecuteSqlQuery<CCustomerBulkRecordset>(...);
您给它CCustomerBulkRecordset
,它不是类型,而是模板。 为了将模板传递给函数,您需要使用模板template参数 。
默认模板参数的存在不会将CCustomerBulkRecordset
转换为CCustomerBulkRecordset<CRecordset>
。 为了获得该信息,您需要CCustomerBulkRecordset<>
因为<>
表示您要使用默认值实例化模板。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.