繁体   English   中英

默认模板类型给出错误,但显式类型不给出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM