初始化程序列表作为容器不起作用
Initializer list as container does not work
考虑以下示例:
#include <algorithm>
#include <iterator>
#include <vector>
template<class InputIterator, class T>
bool privIsElementOf(const T& element, InputIterator first, InputIterator last)
{
return ( std::find(first, last, element) != last );
}
template<class Container, class T>
bool isElementOf(const T& element, const Container & cont)
{
return privIsElementOf( element, std::begin(cont), std::end(cont) );
}
template<class T>
bool isElementOf(const T& element, const std::initializer_list<T> iList)
{
return privIsElementOf( element, std::begin(iList), std::end(iList));
}
int main()
{
std::vector<int> myVec { 1 , 3 , 5};
bool isElement = isElementOf(3, myVec);
bool isElement2 = isElementOf(3, {1 , 3, 5 });
return 0;
}
它与第二个带有initializer_list的isElementOf模板配合得很好。然而,内容或多或少与第一个模板相同。它使用std::begin和std::end。
当我删除第二个模板时,它显示以下编译错误:
initList.cpp:在函数"int main()"中:initList.cpp:31:47:错误:对"isElementOf(int,)"的调用没有匹配的函数bool isElement2=isElementOf(3,{1,3,5});^initList.cpp:31:47:注意:候选者是:initList.cpp:12:6:注意:template bool isElementOf(const T&,const Container&)bool isElementOf(const T&element,const Container&cont)^initList.cpp:12:6:注意:模板参数推导/替换失败:initList.cpp:31:47:注意:无法推导模板参数"Container"bool isElement2=isElementOf(3,{1,3,5});^
有人能给我解释一下这个问题吗?该模板只是要求提供一个与std::begin和std::end兼容的类。为什么容器的模板不适用于初始化程序列表?有没有办法只用一个模板来解决这个问题?
实例
一个函数参数,其关联参数是初始值设定项列表(8.5.4),但参数没有
std::initializer_list
或引用可能合格的简历std::initializer_list
型
是一个非推导上下文(§14.8.2.5[temp.dexecute.type]/p5),因此编译器无法推导Container
。支持的init列表本身没有类型。
一种可能性是提供一个默认的模板参数来覆盖这种情况:
template<class T, class Container = std::initializer_list<T>>
bool isElementOf(const T& element, const Container & cont)
{
return privIsElementOf( element, std::begin(cont), std::end(cont) );
}
请注意,除非您确信代码不会受到其复制语义的影响,否则不应该使用initializer_list
默认参数——底层数组的生存期不会受到initializer_list
对象的任何复制的影响。
相关文章:
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- sigwait() 在多线程程序中不起作用
- 为什么使用数组元素查找最大数字的程序不起作用?
- C++实用程序::转换在静态链接库中不起作用
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 视窗 10 :笔(手写笔)在 MFC 应用程序上不起作用
- win32 滚动条在 C/C++ 程序中不起作用
- 用于拆分空格字符串的程序不起作用
- 反转一个数字程序不起作用,为什么?
- C++ 程序在代码块 IDE 中不起作用
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- 程序在CLion IDE中工作,但exe不起作用
- Opencv在2013年第5季度不起作用.应用程序总是在窗口中崩溃
- C++从句子中删除给定字符的程序不起作用
- C ++ GCC 内联程序集似乎不起作用
- 为什么当我选择>250000个采样点时,程序不起作用?
- 任务计划程序库的预处理不起作用 - 多定义错误
- C 为什么我的程序循环和"if-statements"不起作用?
- try() 和 catch() 不起作用;程序崩溃,从不执行 catch() 块
- Cin 执行不起作用 (程序.exe <文件与数据.txt)