emplace_back和VC++的挫败感
emplace_back and VC++ frustration
我正在使用Visual Studio 2012,使用默认编译器和Nov CTP编译器尝试此操作,下面显示了我的问题:
struct doesCompile
{
int mA, mB, mC, mD, mE;
doesCompile(int a, int b, int c, int d, int e) : mA(a), mB(b), mC(c), mD(d), mE(e)
{
}
};
struct doesNotCompile
{
int mA, mB, mC, mD, mE, mF;
doesNotCompile(int a, int b, int c, int d, int e, int f) : mA(a), mB(b), mC(c), mD(d), mE(e), mF(f)
{
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<doesCompile> goodVec;
goodVec.emplace_back(1, 2, 3, 4, 5);
std::vector<doesNotCompile> badVec;
badVec.emplace_back(1, 2, 3, 4, 5, 6); // error C2660: 'std::vector<_Ty>::emplace_back' : function does not take 6 arguments
return 0;
}
为什么看起来emplace_back最多只能有 5 个参数??他们甚至在 http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx 中说,这需要大量的论据。
使用VS2012有什么办法解决这个问题吗?
这是
由以前的Visual C++编译器体系结构引起的限制。VC++ 的未来版本将取消该限制并允许真正的可变参数模板。
目前,您可以通过在代码中的任何包含之前添加以下内容来静态提高人造可变参数模板的最大限制:
#define _VARIADIC_MAX 6
这会将限制设置为 6 而不是 5(最大可能值为 10),但代价是降低编译速度。
VS2012 11月CTP编译器支持可变参数模板,但其标准库尚未在该版本中更新。应固定在VS2013RC。强烈建议进行升级,因为即使是 11 月的 CTP 也包含很多错误。如果不可能,请使用康拉德·鲁道夫提到的宏。
相关文章:
- 参考资源文件VC++中的$(SolutionDir)
- VC++本机单元测试,找不到调试符号
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- VS2015 中的 VC++ 目录
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 如何解释 #if/#else 位域?(VC++菜鸟)
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- 使用线程 C# 中的 VC++ 6.0 COM DLL
- wcscpy 在 g++ 和 vc++ 中的不同行为
- STL 向量无缘无故损坏,VC++ 2017
- VC++ wcscpy_s随机断言"Buffer is too small"
- 意外的模板与VC++中的std::void_t匹配
- 使用外部依赖项运行 VC++ 单元测试时"Failed to set up execution context"
- Microsoft VC++, vsnprintf, and Pipes (IO) Bug
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- 在Visual Studio 2017上使用VC++ 2015工具链时缺少ATL标头
- VC++ 自动说明符假定矢量的引用限定符<bool>::back的引用限定符