2016-03-19 14 views
-1

Я создавал коды, используя C++ STL. И я хочу использовать «очередь». Итак, я написал коды, как показано ниже. Но я столкнулся с ошибкой «очередь не является шаблоном». Как вы можете видеть, я написал заголовки, связанные с очередью (iostream, queue) в файле «Common.h» и написал include «Common.h» в файле «DataQueue.h». Но, инструмент ID2 VS2013 сказал, что «queue m_deQueue» является ошибкой, потому что очередь не является шаблоном. Я не знаю, почему .. эта ошибка произошла. Любая помощь приветствуется!queue не является шаблоном

//[Common.h] 
#ifndef _COMMON_ 
#define _COMMON_ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <string> 

//thread related headers 
#include <Windows.h> 
#include <process.h> 

//socket related headers 
#include <winsock.h> 

#include <iostream> 
#include <queue> 
#include <deque> 
#include <vector> 
#include <algorithm> 
#include <math.h> 

using namespace std; 

#endif 


//[DataQueue.h] 
#ifndef _QUEUE_ 
#define _QUEUE_ 

#include "SocketStruct.h" 
#include "Common.h" 

class CDataQueue{ 
private: 
    static CDataQueue*     m_cQueue; 
// deque <ST_MONITORING_RESULT>  m_deQueue; 
    queue <ST_MONITORING_RESULT>  m_deQueue; 
    CRITICAL_SECTION     m_stCriticalSection; 

    CDataQueue(); 
    ~CDataQueue(); 

public: 
    static CDataQueue* getDataQueue(){ 
     if (m_cQueue == NULL){ 
      m_cQueue = new CDataQueue(); 
     } 

     return m_cQueue; 
    } 

    deque <ST_MONITORING_RESULT> getQueue(); 
    void pushDataToQueue(ST_MONITORING_RESULT data); 
    ST_MONITORING_RESULT popDataFromQueue(); 

}; 
#endif 


//[DataQueue.cpp] 
#include "DataQueue.h" 

CDataQueue* CDataQueue::m_cQueue = NULL; 

CDataQueue::CDataQueue(){ 
    ::InitializeCriticalSection(&m_stCriticalSection); 
    // m_mutex = PTHREAD_MUTEX_INITIALIZER; 
} 

CDataQueue::~CDataQueue(){ 
    ::DeleteCriticalSection(&m_stCriticalSection); 
} 

::deque <ST_MONITORING_RESULT> CDataQueue::getQueue(){ 

    return m_deQueue; 
} 

void CDataQueue::pushDataToQueue(ST_MONITORING_RESULT data){ 

    ::EnterCriticalSection(&m_stCriticalSection); 
    m_deQueue.push_back(data); 
    ::LeaveCriticalSection(&m_stCriticalSection); 
} 

ST_MONITORING_RESULT CDataQueue::popDataFromQueue(){ 

    ::EnterCriticalSection(&m_stCriticalSection); 
    ST_MONITORING_RESULT data = m_deQueue.front(); 
    m_deQueue.pop_front(); 
    ::LeaveCriticalSection(&m_stCriticalSection); 

    return data; 
} 
+0

Я думаю [чтение ** этого **] (https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered -бад-практика), прежде чем продолжить, было бы целесообразно. И fyi, '_QUEUE_' и' _COMMON_' являются зарезервированными идентификаторами для реализации и не должны использоваться в качестве идентификаторов заголовок fencepost. – WhozCraig

ответ

4

Сидя в верхней части <queue> заголовка из MS дела ввода стандартной библиотеки, мы находим ...

// queue standard header 
#pragma once 
#ifndef _QUEUE_ 
#define _QUEUE_ 

Что означает ваше использование этого идентификатора для собственного fencepost заголовка является исключающим корпус заголовка MS оттягивается. Таким образом, для вас нет std::queue. Используйте другой идентификатор, желательно что-то, что не нарушает правила использования для макро констант, зарезервированных для реализации (например, этот).

И это, дети, поэтому мы не используем идентификаторы, зарезервированные для использования в реализации. Для получения дополнительной информации прочтите этот вопрос: "What are the rules about using an underscore in a C++ identifier?"

+0

большое спасибо! Я исправил его, и он работает! –

Смежные вопросы