2

私は Windows 8 で Visual Studio 2012 を使用しており、スレッド セーフとその他のいくつかの機能を追加する std::queue のラッパーを作成しようとしています。emplace のラッパー関数の作成に問題があります。可変個引数テンプレートがエミュレートされる方法が原因であると思われますが、修正方法がわかりません.

template <typename T>
class MyQueue
{
public:
   template <class... Args>             // line 20
   void emplace(Args&&... args)
   {
      mQueue.emplace(std::forward<Args>(args)...);
   }
private:
   std::queue<T> mQueue;
};

このコードでは、一連の構文エラーが発生します。

@ 20 行目:

  • C2011: '': 'enum' 型の再定義
  • C2143: 構文エラー: '...' の前に ',' がありません
  • C2332: 'class': タグ名がありません

@ 21 行目:

  • C2059: 構文エラー: '...'
  • C2065: 'Args': 宣言されていない識別子

emplace基になるキューの機能を利用するクリーンな方法はありますか? 私はパフォーマンスが重要なことは何もしていないので、価値以上のトラブルが発生した場合は、呼び出し元に強制的にpush.

どのソリューションも VC++11 を使用する必要があります。プラットフォームやコンパイラを切り替えることは、私にとって選択肢ではありません。

4

1 に答える 1

1

プロジェクト設定で Platform Toolset を Nov 2012 CTP に変更することで、これを機能させることができました。他の人が指摘したように、コード自体は正しかった。簡単な例については、以下を参照してください。

MyQueue.h:

#pragma once

#include <queue>

template <typename T>
class MyQueue
{
public:
    template <class... Args>
    void emplace(Args&&... args);
private:
    std::queue<T> mQueue;
};

template <typename T>
template <class... Args>
void MyQueue<T>::emplace(Args&&... args)
{
    mQueue.emplace(std::forward<Args>(args)...);
}

メイン.cpp

#include "MyQueue.h"

struct Test
{
    int mA, mB;
    Test(int a, int b) : mA(a), mB(b) { }
};

int main()
{
    MyQueue<Test> q;
    q.emplace(1, 1);
    q.emplace(2, 2);
    q.emplace(3, 3);

    return 0;
}
于 2013-03-27T01:45:29.633 に答える