2017-09-12 3 views
0

私は以下のようなスレッドセーフなキュークラスを持って、C++クラステンプレート型のstd ::リスト

クラスCMDQ:

template <typename Q> 
class CmdQ 
{ 
public: 
    CmdQ() : 
     queue_(), 
     queueMutex_(){}; 
    ~CmdQ() { 
     while (!queue_.empty()) { 
      Q* element(std::move(this->queue_.front())); 
      this->queue_.pop(); 
      delete element; 
     } 
    }; 
    void push(Q* commands) { 
     std::unique_lock<std::mutex> lock(this->queueMutex_); 

     queue_.push(commands); 
     this->mutexCondition_.notify_all(); 
    } 
    void pop() { 
     std::unique_lock<std::mutex> lock(this->queueMutex_); 
     while(this->queue_.empty())this->mutexCondition_.wait(lock); 
     Q* element(std::move(this->queue_.front())); 
     this->queue_.pop(); 
     delete element; 
    } 

    Q* front() { 
     std::unique_lock<std::mutex> lock(this->queueMutex_); 
     while(this->queue_.empty())this->mutexCondition_.wait(lock);  if (!queue_.empty()) { 
      return (queue_.front()); 
     } 
     return NULL; 
    } 

    bool empty() { 
     std::unique_lock<std::mutex> lock(this->queueMutex_); 
     return queue_.empty(); 
    } 

    void clear() { 
     std::unique_lock<std::mutex> lock(this->queueMutex_); 

     while (!queue_.empty()) { 
      Q* element(std::move(this->queue_.front())); 
      this->queue_.pop(); 
      delete element; 
     } 
    } 

    unsigned int size() { 
     std::unique_lock<std::mutex> lock(this->queueMutex_); 
     return queue_.size(); 
    } 

private: 
    std::queue queue_; 
    std::mutex queueMutex_; 
    std::condition_variable mutexCondition_; 
}; 

は今、私はこのキューは、リストを含むようにしたいです。

エラー1エラーC2993:私のようなエラーを得続ける、

template<typename std::list<Message*>> 
class CmdQ; 

CmdQ<std::list<Message*>>* msgListQ_; 

しかし「のstd ::リスト<を

をClassB.h:だから、私は以下のように使用しました_Ty>」:非タイプ テンプレートパラメータのための違法なタイプ 『:CMDQ『: のための無効なテンプレート引数 『__formal』

エラー3エラーC2975』無名のパラメータ』、コンパイルティム期待電子定数式

私はテンプレートの種類がstd::listを受け入れることはできませんが、リストへのポインタを受け入れ、そうもClassB.hに以下のように一覧表示するには、ポインタを使用してみましたということいくつかのドキュメントを参照:

template<typename std::list<Message*>*> 
class CmdQ; 

CmdQ<std::list<Message*>*>* msgListQ_; 

しかし、私依然としてエラーに直面している。

何か助けていただければ幸いです。

ありがとうございます!

+2

'std :: queue queue_;'は 'std :: queue queue_;'にするべきですか? – NathanOliver

+0

とにかく明示的なインスタンス化は必要ありません。テンプレートを使用して変数を宣言することができます。 – chris

+0

@NathanOliver 'std :: queue queue'ではなく、 –

答えて

2

私が間違っている部分が

template<typename std::list<Message*>*> 
class CmdQ; 

typename

template <std::list<Message*>*> 
class CmdQ; 

で試すか、それを避け、単にとにかく

CmdQ<std::list<Message*>*>* msgListQ_; 

を書きであると仮定

テンプレートタイプが受け入れることができないドキュメントを参照しました::リスト

何ですか?

テンプレートクラス

template <typename> 
class foo { }; 

引数なしでそれを渡すと

foo<std::list> fl0; 

を以下のように(std::listは、このように、テンプレートテンプレート引数であるため)、std::listを受け入れません引数を使って受け入れます。

foo<std::list<int>> fl1; 
+0

あなたの提案をありがとう。私は "template *> class CmdQ;"に変更しました。 "CmdQ *> * msgListQ_;"を使用しています。しかし、私はまだ私が上記の同じエラー1とエラー3を参照してください。これについての他の洞察? –

+0

@MonicaRajasekaran - それを削除しようとしましたが、単に 'CmdQ *> * msgListQ_;'と書いてみましたか?とにかく、問題はヘッダーの包含の問題になる可能性があります。 'CmdQ'が実装されているヘッダを(前に)含めましたか?標準ヘッダ 'list'をインクルードしましたか?私はエラーを再現するために、最小限の、しかし完全な例を用意しなければなりません。 – max66

+0

はい!それはうまくいった。ありがとう、トン。そのクラスの前方宣言は私を乱した。 –

2

クラスが壊れています無効のために(コンパイルしない)

std::queue queue_; 

宣言。 std::queueはテンプレートであり、有効なテンプレート引数を指定する必要があります。

あなたがタイプQ*のものをプッシュとポップので、テンプレートの残りの部分と一貫性のみ宣言は今

std::queue<Q*> queue_; 

CmdQ<std::list<Message*>*>だろう内部キューは、ヒープ割り当てを格納しますよう完全に間違っですポインタのポインタ(ポインタ自体を格納するリスト)。あなたは確かにそれを望んでいません。

キュークラスがポインターを操作するように制約をかけています(また、ポインティングされたオブジェクトを所有することもできます)。その選択を非常に厳しく制限するのはほとんど意味がありません。生のCスタイルのポインタは一般的な使用には推奨されません。スマートポインタを使用する必要があります。ポインタを動かすこともほとんど意味がありません。また、リストを所有することはほとんど意味がなく、その要素ではない。クラスからすべてのアスタリスクを削除し、deleteへの呼び出しを削除した場合、テンプレートはよりシンプルになり、より汎用的でより一貫したものになります。

CmdQ<std::list<Message>> // store lists by value 
CmdQ<std::list<Message*>*> // store pointers to lists of pointers (not recommended) 
CmdQ<std::unique_ptr<std::list<std::shared_ptr<Message>>>> // etc 

または任意の組み合わせを使用できます。あなたはたぶんここに2,への2つの呼び出しを追加する必要があります。生のポインタでテンプレートを使用する理由を説明できない理由がある場合に備えて、オプションの要素削除プログラムを追加することもできます。

+0

ご理解いただきありがとうございます。 –

関連する問題