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:“类”:缺少标签名称

@ 第 21 行:

  • C2059:语法错误:'...'
  • C2065:'Args':未声明的标识符

有什么干净的方法可以利用底层队列的emplace功能吗?我没有做任何对性能至关重要的事情,所以如果它最终比它的价值更麻烦,我只会强迫调用者使用push.

任何解决方案都必须使用 VC++11 - 切换平台或编译器不是我的选择。

4

1 回答 1

1

我最终通过在项目设置中将平台工具集更改为 2012 年 11 月的 CTP 来实现这一点。正如其他人指出的那样 - 代码本身是正确的。请参阅下面的简单示例。

我的队列.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)...);
}

主文件

#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 回答