C2660:_splitpath_s在Visual Studio 2013中因std :: array错误而失败

时间:2016-10-19 00:17:13

标签: c++ arrays c++11 visual-studio-2013

Visual Studio 2013在语言数组上有点奇怪,在全局函数中它允许将其初始化为char result[100] = { 0 };,但如果它是一个类的成员则不会至 int m_array[3];,对于class A内的A() :m_array{ 0, 1, 2 } {}std::array<int, 3> m_array;失败,错误为C2536:&#34;&#39; A :: A :: m_array&#39; :无法为数组指定显式初始化程序&#34;。

在同一篇文章Workaround for error C2536: cannot specify explicit initializer for arrays in Visual Studio 2013中,使用 A() : m_array ({ 0, 1, 2 }) {}代替和initilzie A() : m_array ({ { 0, 1, 2 } }) {} ,IDE红色下划线&#34; 0&#34;提示&#34; 错误:此子对象初始值设定项不能省略大括号。&#34;但可以编译。

更好的是,a work-around is suggested建议使用额外的一对括号 std::array,现在一切顺利!

要将char *传递给需要my_array.data()参数的函数,one comments建议使用my_arraystd::array_spitpath_s

现在我遇到了char *的问题:

传统的_splitpath_s(fullpathfilename, drive, dir, name, ext)样式编译 char其中参数都是std::array个数组;但使用class B2 { public: const int MAX_LEN = 200; std::array<char, 200> drive, dir, name, ext; B2() :drive({ { 0 } }), dir({ { 0 } }), name({ { 0 } }), ext({ { 0 } }) {} void split(const char * fullpathfilename) { _splitpath_s(fullpathfilename, drive.data(), dir.data(), name.data(), ext.data()); //error C2660: '_splitpath_s' : function does not take 5 arguments } }; 将触发错误C2660:

_splitpath_s

为什么stdlib.h在这里失败?这是一个旧的C风格函数,在foreach ($array as $key => $value){ $array[$key] = "New Value"; } 中定义,如果在C ++中解决这个问题,也是可以接受的。

1 个答案:

答案 0 :(得分:2)

_splitpath_s的5参数版本是模板函数,期望输入路径的字符指针,以及其他4的C样式字符数组。因为您传入了C ++ array个对象,模板没有生成,由于SFINAE,它不可用,因此没有任何函数需要5个参数。

要使用它,您必须使用9参数版本,您可以在其中传入输入地址和缓冲区大小。