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

Why does including an arbitrary STL header resolves these compilation errors?

本文关键字:解决 编译 错误 包含任 STL 为什么      更新时间:2023-10-16

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

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

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

#include <initializer_list>

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

你能向我解释为什么包含任意 STL 标头可以解决这个问题吗?

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

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

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

不是任意的STL 标头。

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

1 除了通过包含<iterator>标头可用之外,27.8 中的函数模板在包含以下任何标头时可用:<array><deque><forward_list><list><map><regex><set><string><unordered_map><unordered_set><vector>

有趣的是,<string_view>不在那个名单上。

  • 有一个关于此的现有缺陷报告报告。
  • libc++至少定义了std::begin,如果你包括<string_view>std::end