7

私は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を使用して、これを回避する方法はありますか?

4

2 に答える 2

7

これは、以前の Visual C++ コンパイラ アーキテクチャによる制限です。VC++ の将来のバージョンでは、その制限が解除され、真の可変個引数テンプレートが許可されます。

現時点では、コードにインクルードするに次を追加することで、偽の可変個引数テンプレートの最大制限を静的に引き上げることができます。

#define _VARIADIC_MAX 6

これにより、コンパイル速度が低下しますが、制限が 5 ではなく 6 に設定されます (最大値は 10 まで)。

于 2013-10-05T16:50:19.040 に答える
4

VS2012 November CTPコンパイラは可変個引数テンプレートをサポートしていますが、標準ライブラリはそのリリースでまだ更新されていません。VS2013RC で修正する必要があります。11 月の CTP にも多くのバグが含まれていたため、アップグレードを強くお勧めします。不可能な場合は、Konrad Rudolph が言及したマクロを使用してください。

于 2013-10-05T16:50:50.963 に答える