c++ - 无法调用模板构造函数
问题描述
我正在实现一个类似于 std::list 的类。我在调用错误的构造函数时遇到问题。
这是一个工作代码片段:
#include <iostream>
template <typename T>
class dslist
{
public :
typedef size_t size_type ;
public :
explicit dslist( const size_type count , const T &value ) ;
template <typename InputIt>
explicit dslist( InputIt first , InputIt last ) ;
} ;
template <typename T>
dslist<T>::dslist( const size_type count , const T &value )
{
std::cout << "count, value ctor" << std::endl ;
}
template <typename T>
template <typename InputIt>
dslist<T>::dslist( InputIt first , InputIt last )
{
std::cout << "Iterator" << std::endl ;
}
int main()
{
dslist<int> l( 10 , 20 ) ;
return 0 ;
}
如果我运行它,将调用迭代器构造函数。但是,实际上应该调用第一个构造函数 (count, value)。
在这种情况下如何确保调用第一个构造函数?
编辑以添加从答案中提取的解决方案:
解决方案
#include <iostream>
#include <utility>
#include <vector>
#include <type_traits>
template <typename T>
class dslist
{
public :
typedef size_t size_type ;
public :
explicit dslist( const size_type count , const T &value ) ;
template <typename InputIt, typename = decltype(*std::declval<InputIt>())>
explicit dslist( InputIt first , InputIt last ) ;
} ;
template <typename T>
dslist<T>::dslist( const size_type count , const T &value )
{
std::cout << "count, value ctor" << std::endl ;
}
template <typename T>
template <typename InputIt, typename>
dslist<T>::dslist( InputIt first , InputIt last )
{
std::cout << "Iterator" << std::endl ;
}
int main()
{
dslist<int> l( 10 , 20 ) ;
std::vector<int> v( 10 ) ;
dslist<int> l1( std::begin( v ) , std::end( v ));
return 0 ;
}
解决方案
推荐阅读
- reactjs - Reactjs - 使用反应路由器更改 url 但组件没有改变
- javascript - 在新标签中打开谷歌地图街景显示错误的地方
- python - 我想限制用户在“类型”字段中添加重复值
- node.js - 如何将云功能部署到 .firebaserc 中的不同项目?
- actions-on-google - 退出时不调用actions_intent_CANCEL
- ansible - RHEL 8 EC2 实例中的 Yum 安装失败
- vb.net - 隐藏/禁用 DataGridView 列/行调整大小行
- html - 我不能在带有 CSS 的按钮上将文本居中
- linux - Selenium 3.141.59 with java in red hat 7.7 无法创建新的 chrome 驱动程序
- scala - spark scala比较具有时间戳列的数据帧