std :: queue emplace的包装器

时间:2013-03-24 21:45:45

标签: c++ visual-c++ c++11 visual-studio-2012 variadic-templates

我在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 - 切换平台或编译器不适合我。

1 个答案:

答案 0 :(得分:1)

我最终通过在项目设置中将Platform Toolset更改为2012年11月的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)...);
}

Main.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;
}