2016-08-19 2 views
1

私はC++言語に新しく、以下の問題の助けが必要です。現在、私は "テンプレート"と "関数ポインタ"の周りに頭を抱えようとしています。次のテンプレートクラス、キュー、単一.cppファイルに書き込まれたときにコンパイルされます。しかしテンプレートと関数ポインタ:テンプレートクラスで宣言された関数ポインタを定義するにはどうすればよいですか?

template <typename T> class Queue 
{ 
    public: 
    Queue() 
    { 
     m_add = m_remove = 0; 
    } 
    void enque(T *c) 
    { 
     m_array[m_add] = c; 
     m_add = (m_add + 1) % SIZE; 
    } 
    T *deque() 
    { 
     int temp = m_remove; 
     m_remove = (m_remove + 1) % SIZE; 
     return m_array[temp]; 
    } 
    private: 
    enum 
    { 
     SIZE = 8 
    }; 
    T *m_array[SIZE]; 
    int m_add, m_remove; 
}; 

、私は.hのと(以下など)の.cppファイルにこのコードを分離するとき、私は私はエラーを取得.cppファイルに関数ポインタを定義します。

template<typename T> 
T (Queue<T>::*deque)() { 

Queue.h:

#ifndef QUEUE_H_ 
#define QUEUE_H_ 

template<typename T> 
class Queue { 
    enum { 
     SIZE = 8 
    }; 
    T *m_array[SIZE]; 
    int m_add, m_remove; 
public: 
    Queue(); 
    virtual ~Queue(); 
    void enque(T *c); 
    T *deque(); 
}; 

#endif /* QUEUE_H_ */ 

Queue.cpp:線付近

#include "Queue.h" 

template<typename T> 
Queue<T>::Queue() { 
    m_add = m_remove = 0; 
} 

template<typename T> 
Queue<T>::~Queue() { 
} 

template<typename T> 
void Queue<T>::enque(T *c) { 
    m_array[m_add] = c; 
    m_add = (m_add + 1) % SIZE; 
} 

template<typename T> 
T (Queue<T>::*deque)() { 
    int temp = m_remove; 
    m_remove = (m_remove + 1) % SIZE; 
    return m_array[temp]; 
} 

私はあなたの1は、専門家は、私が定義する方法を理解するのに役立つ可能性があり、C++ことを期待しています関数ポインタ< T * deque()>ご協力いただきありがとうございます。

+0

"* C++ポインタ*"に注意してください。あなたのコードは潜在的に危険です! –

+0

@Biagio、警告ありがとう。 – Otelagh

答えて

1

あなたの実装はあなたの宣言と(明らかに)一致しません。あなたの関数はのように宣言されます。

template<class T> 
class Queue 
{ 
    //... other members 

    T* deque(); 
}; 

クラス本体の外では、それは次のようになります言っ

template<class T> 
T* Queue<T>::deque() 

は、あなたがこれを読んでする必要があります:"Why can templates only be implemented in the header file"。これは、あなたがテンプレートの実装をcppファイルに移動したという間違いである可能性が高い理由を説明します:ヘッダーです。

+0

リンクに感謝します。それは役に立ちました。私はあなたのアドバイスを受け取り、実装を.tppファイルに入れ、ヘッダファイルの最後にインクルードします。私はまだ* deque()関数の定義に問題があります。質問:上の* deque()関数を別の.tppファイルで定義する場合は、どうしますか?私はまだこの1つの関数(* deque())のコンパイルエラーに悩まされています。 – Otelagh

+0

「あなたはどうしますか」 - *私はそうではない*。テンプレート宣言と実装(アウトオブライン実装を含む)を、それらが所属するヘッダファイルに置きます。別のヘッダー+ something-elseに分割するには何の利益もありません。コンパイルに関しては、class-bodyからそのクラステンプレートメンバを定義するための構文は、私の答えに示すように*正確に*です。それでもまだコンパイルエラーが発生している場合は、更新されたソースコードを使用して質問に補遺を追加する必要があります。 – WhozCraig

+0

...それは働いた。私はコンパイルがうまくいく前に "クリーン"する必要があっただけです。ありがとう、WhozCraig。 RE:「何の利益もありません...」あなたが言っていることが聞こえます。私はC++ラングの新人です。だから私は何が効果的で、なぜそれを確立しようとしています。あなたが私に与えたリンクは、テンプレート宣言を実装から離れて分割することが常に良いことと、.tppファイルを使用することがこの目標を達成することを暗示しているようです。 – Otelagh

関連する問題