我在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行:
@第21行:
是否有任何干净的方法可以使用基础队列的emplace
功能?我没有做任何性能关键的事情,所以如果它最终会比它更值得麻烦我只会强迫来电者使用push
。
任何解决方案都必须使用VC ++ 11 - 切换平台或编译器不适合我。
答案 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;
}