为什么包含任意STL头解决了这些编译错误?

时间:2017-08-13 10:41:50

标签: c++ stl

我的程序中有这个全局函数:

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标头可以解决此问题,以及我应该如何正确解决它?

谢谢。

3 个答案:

答案 0 :(得分:8)

由于您使用的是initializer_list,因此应包含initializer_list

#include <initializer_list>

包括string解决错误,因为string可能包含initializer_list,但这种间接包含不是推荐方式。

答案 1 :(得分:4)

  

您能否向我解释为什么包含任意STL标头可以解决此问题,

因为许多标准标题在其实现中包含其他标题。

  

以及我应该如何正确解决它?

包含专用于包含这些缺失函数/类型的标题 在您的情况下,根据documentation<iterator><initializer_list>标题。

答案 2 :(得分:1)

任意 STL标头。

如果你看一下标准中std::beginstd::end的定义,它会说:(在[iterator.container] / p1中):

  

1除了通过包含<iterator>标头可用之外,当包含以下任何标头时,27.8中的功能模板可用:<array><deque>,{{ 1}},<forward_list><list><map><regex><set><string><unordered_map>和{{1 }}

有趣的是,<unordered_set>不在该列表中。

  • existing defect report报告。
  • libc ++,至少,如果你包含<vector> 定义<string_view>std::begin