我的程序中有这个全局函数:
static bool IsValidType(const CString& cType)
{
for (auto pType : {"bmp","jpg","jpeg","gif","tif","tiff","png"})
if (cType == CString(pType))
return true;
return false;
}
它给了我以下编译错误:
error C3312: no callable 'begin' function found for type 'initializer-list'
error C3312: no callable 'end' function found for type 'initializer-list'
error C2065: 'pType' : undeclared identifier
我可以通过在函数体之前包含任意STL头来解决它,例如:
#include <string>
static bool IsValidType(const CString& cType)
{
...
}
但当然,我不认为这是正确的做法。
您能否向我解释为什么包含任意STL标头可以解决此问题,以及我应该如何正确解决它?
谢谢。
答案 0 :(得分:8)
由于您使用的是initializer_list,因此应包含initializer_list
。
#include <initializer_list>
包括string
解决错误,因为string
可能包含initializer_list
,但这种间接包含不是推荐方式。
答案 1 :(得分:4)
您能否向我解释为什么包含任意STL标头可以解决此问题,
因为许多标准标题在其实现中包含其他标题。
以及我应该如何正确解决它?
包含专用于包含这些缺失函数/类型的标题
在您的情况下,根据documentation,<iterator>
,<initializer_list>
标题。
答案 2 :(得分:1)
不任意 STL标头。
如果你看一下标准中std::begin
和std::end
的定义,它会说:(在[iterator.container] / p1中):
1除了通过包含
<iterator>
标头可用之外,当包含以下任何标头时,27.8中的功能模板可用:<array>
,<deque>
,{{ 1}},<forward_list>
,<list>
,<map>
,<regex>
,<set>
,<string>
,<unordered_map>
和{{1 }}
有趣的是,<unordered_set>
不在该列表中。
<vector>
, 定义<string_view>
和std::begin
。