为什么包含任意 STL 标头可以解决这些编译错误?
Why does including an arbitrary STL header resolves these compilation errors?
>我的程序中有这个全局函数:
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::begin
和std::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
。
相关文章:
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 在Linux/Ubuntu中编译openCV应用程序时,如何解决未定义的引用cv:..?
- 如何解决我在 Ubuntu 19.04 下使用 GLFW 时遇到的这个编译问题?
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 正在尝试解决特定于gcc的编译错误
- 为什么包含任意 STL 标头可以解决这些编译错误?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- C++编译错误LNK2019:未解决的外部符号错误
- 如何解决RUN_ERROR即使它正常编译
- 当 pkg-config 不能解决 opencv 'undefined reference'编译问题时,如何解决它?
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 解决此C 代码的编译错误
- 使用/解决模板时停止编译
- 编译轨道样品时的C 错误-LNK2019未解决的外部符号
- 尝试解决"out of scope"编译错误:CodeBlocks,Linux Fedora
- 窄转换编译警告.如何解决它
- 格式化如何解决操作数编译错误关于c++操作数ATR的
- 在CentOS 7 x64上编译QT时,如何解决矛盾的库问题
- 如何使用"python setup.py build"解决C++/C编译过程中的"conflicting types"错误?