emplace_back和VC++的挫败感

emplace_back and VC++ frustration

本文关键字:VC++ back emplace      更新时间:2023-10-16

我正在使用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 也包含很多错误。如果不可能,请使用康拉德·鲁道夫提到的宏。