2012-12-21 4 views
0

내부 템플릿 클래스 선언에 문제가 있습니다.내부 템플릿 클래스를 선언하는 방법은 무엇입니까?

은 내가이 Class Aa.h 여기에 내 코드가 어떤 도움은 매우 극명하게 될 것이다

class A 
{ 
    public: 

    private: 
    // How declare LockFreeQueue here 

}; 

template <typename T> 
struct LockFreeQueue 
{ 
     LockFreeQueue(); 
     void push(const T& t); 
     bool pop(T& t); 
    private: 
     typedef std::list<T> TList; 
     TList list; 
     typename TList::iterator iHead, iTail; 

}; 

/** 
* Constructor 
* Initializes required variables 
* */ 
template <typename T> 
LockFreeQueue<T>::LockFreeQueue() 
{ 
    list.push_back(T()); 
    iHead = list.begin(); 
    iTail = list.end(); 
} 

/** 
* pushes data in the list 
* @param datatype that needs to be pushed 
* */ 
template <typename T> 
void LockFreeQueue<T>::push(const T& t) 
{ 
    list.push_back(t); 
    iTail = list.end(); 
    list.erase(list.begin(), iHead); 
} 

/** 
* Pops Queue 
* @param t stores popped data at t's address 
* @return true if data available, false otherwise 
* */ 
template <typename T> 
bool LockFreeQueue<T>::pop(T& t) 
{ 
    typename TList::iterator iNext = iHead; 
    ++iNext; 
    if (iNext != iTail) 
    { 
    iHead = iNext; 
    t = *iHead; 
    return true; 
    } 
    return false; 
} 

같은

감사 & BR 모습입니다 Yuvi이

+0

당신은 내부 클래스 자체, 또는 클래스 형의 멤버를 선언 하시겠습니까? –

답변

3

그냥 내 이동 만들 수 있습니다

class A 
{ 
    public: 

    private: 

     template <typename T> 
     struct LockFreeQueue 
     { 
      LockFreeQueue(); 
      void push(const T& t); 
      bool pop(T& t); 
     private: 
      typedef std::list<T> TList; 
      TList list; 
      typename TList::iterator iHead, iTail; 
     }; 
}; 

그리고 추가 A의 범위는 다음과 같이 정의 할 때 :

template <typename T> 
A::LockFreeQueue<T>::LockFreeQueue() 
+0

그럼 내가 선언 할 수있는 곳은 입니다.'LockFreeQueue mQueue;'의 사적인 범위에? – Yuvi

+0

@Yuvi 내부의 'A' 선언에서, 내부 클래스의 선언 이후 – SomeWittyUsername

관련 문제