2017-08-13 13 views
4

我有这个全局函数在我的计划:为什么包含一个任意的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头解决了这个问题,以及我应该如何解决它?

谢谢。

+1

也许应该补充一点,我在这里(因此'CString')使用MFC ... – goodvibration

+0

我猜你需要包括''其中被列入STL的头文件 – kim366

+2

哦,还是仅仅包括''。 – kim366

回答

4

能否请您解释一下,为什么包括任意STL头解决了这一问题,

因为很多标准头包括在其实施其他的。

以及我应该如何解决它?

包含专用于包含这些缺少的函数/类型的标头。
在你的情况下是<iterator><initializer_list>头根据documentation

+1

谢谢。我认为'for(auto pType:{...})'符号是自然C++语法的一部分。从你的回答中,我明白它不是......? – goodvibration

+1

@goodvibration不是没有必要的具体类型。 – user0042

+1

@goodvibration - 它是自然C++语法的一部分。但是使用中的容器必须支持该协议。由'{...}'创建的对象是'std :: initializer_list',通常不会像你那样迭代。所以协议相关的东西不会被拉入没有标题。 – StoryTeller

8

由于您使用initializer_list您应该包括initializer_list

#include <initializer_list> 

包括string解决错误的string可能包括initializer_list,但那种间接的包括不推荐的方式。

1

不是任意 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>不在该列表中。

  • 有一个existing defect report报告。
  • libC++,至少确实定义std::beginstd::end如果您包括<string_view>
+0

3009是'size/empty/data'。 'begin/end'是2812,它在C++ 17中(另外,2812只是在[iterator.range]中重复了[string.view.synop]已经说过的内容,所以它甚至不是必须的)。 –

+0

另外,OP使用'initializer_list',它在[support.initlist.range]中有自己的'begin/end',不受这种措辞的影响。 –

相关问题