私はConcurrency :: unbounded_buffer(VC++ 2010から)を使用しているという事実を隠すために、実装慣用へのポインタを使用しようとしています。問題は、私はテンプレートでそれをやっているとコンパイルエラーに立ち往生している。テンプレートクラスになる:コンパイルエラー
BlockingQueue.h
#pragma once
namespace DRA{
namespace CommonCpp{
//Forward declaration
template <class Element> class BlockingQueueImpl;
template <class Element>
class BlockingQueue{
BlockingQueueImpl<Element>* m_pImpl;
//Forbid copy and assignment
BlockingQueue(const BlockingQueue&);
BlockingQueue& operator=(const BlockingQueue&);
public:
BlockingQueue();
~BlockingQueue();
void Push(Element newElement);
Element Pop();
};
}
}
BlockingQueue.cpp
#include "BlockingQueue.h"
#include "BlockingQueueImpl.h"
using namespace DRA::CommonCpp;
BlockingQueue<class Element>::BlockingQueue():
m_pImpl(new BlockingQueueImpl<Element>()){
}
BlockingQueue<class Element>::~BlockingQueue(){
//Let the implementation's destructor handle pending Pops
delete m_pImpl;
}
template<class Element>
void BlockingQueue<Element>::Push(Element newElement){
m_pImpl->Push(newElement);
}
template<class Element>
Element BlockingQueue<Element>::Pop(){
return m_Impl->Pop();
}
BlockingQueueImpl.h
#pragma once
#include <agents.h> //This is VS2010 Exclusive (Concurrency Runtime)
namespace DRA{ namespace CommonCpp{ template <class Element> class BlockingQueue; } }
namespace DRA{
namespace CommonCpp{
template <class Element>
class BlockingQueueImpl{
Concurrency::unbounded_buffer<Element> m_Queue;
//Only friends can use this class
friend class BlockingQueue<Element>;
BlockingQueueImpl();
~BlockingQueueImpl();
//Forbid copy and assignment
BlockingQueueImpl(const BlockingQueueImpl&);
BlockingQueueImpl& operator=(const BlockingQueueImpl&);
//Members
void Push(Element newElement);
Element Pop();
};
}
}
BlockingQueueImpl.cpp
#include "BlockingQueueImpl.h"
using namespace DRA::CommonCpp;
BlockingQueueImpl<class Element>::BlockingQueueImpl(){
}
BlockingQueueImpl<class Element>::~BlockingQueueImpl(){
}
template<class Element>
void BlockingQueueImpl<class Element>::Push(Element newElement){
send(m_Queue, newElement);
}
template<class Element>
Element BlockingQueueImpl<class Element>::Pop(){
return receive(m_Queue);
}
:ここでは、コードです
エラーです:
BlockingQueueImpl.cpp(12): error C2649: 'typename' : is not a 'class'
私は友人の宣言でテンプレートパラメータにクラスを追加しようとしたが、それは、テンプレートと
一部のコンパイラ彼は事前にC++ 11の言語の一部となっていました。この形式は、クラス型(class、struct、union、cv-qualifierを無視する)、または 'friend typename-specifier;'クラスの型として 'friend simple-type-specifier;'と解釈され、 'class simple ' (まだ遭遇していない場合にはそれを宣言しません)、あるいは 'typename-specifier'を無視します。これはクラスではないからです。テンプレート型のパラメータでうまく演奏されます。 –