我正在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:'':'枚举'类型重新定义
  • C2143:语法错误:在'...'之前缺少','
  • C2332:“类”:缺少标签名称

  • @第21行:
  • C2059:语法错误:'...'
  • C2065:“Args”:未声明的标识符

  • 有什么干净的方法可以利用底层队列的emplace函数?我对性能没有任何影响,因此,如果最终遇到的麻烦超过了值得的程度,我将迫使调用者使用push

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

    最佳答案

    我最终通过在项目设置中将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;
    }
    

    关于c++ - std::queue emplace的包装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15604412/

    10-09 05:36