【问题标题】:emplace_back and VC++ frustrationemplace_back 和 VC++ 的挫败感
【发布时间】:2013-10-12 13:42:21
【问题描述】:

我正在使用 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?

【问题讨论】:

    标签: c++ visual-c++ c++11 vector stl


    【解决方案1】:

    这是以前的 Visual C++ 编译器架构造成的限制。未来版本的 VC++ 将解除该限制并允许 true 可变参数模板。

    目前,您可以通过在代码中添加以下 before 来静态提高虚假可变参数模板的最大限制:

    #define _VARIADIC_MAX 6
    

    这会将限制设置为 6 而不是 5(最大可能值为 10),但会降低编译速度。

    【讨论】:

      【解决方案2】:

      VS2012 年 11 月 CTP 编译器 支持可变参数模板,但其标准库 尚未在该版本中更新。应该在 VS2013RC 中修复。强烈建议升级,因为即使是 11 月的 CTP 也包含很多错误。如果不可能,请使用 Konrad Rudolph 提到的宏。

      【讨论】:

      • VS2012 不支持可变参数模板。 VS2012 CTP 支持可变参数模板。理论上。
      猜你喜欢
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多