2016-08-19 106 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]; 
} 

我希望你們中的一個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()函數的問題。問題:如果你要在單獨的.tpp文件中定義上述* deque()函數,你會怎麼做?我仍然只爲這一個函數編譯錯誤(* deque())。 – Otelagh

+0

「你會怎麼做」 - *我不會*。我會將模板聲明和實現(包括超線程實現)放在它們所屬的頭文件中。沒有任何收益*將它分成單獨的標題+其他的東西。關於編譯,從class-body定義類模板成員的語法是* exact *,正如我在答案中顯示的那樣。如果您仍然收到編譯時錯誤,則應使用更新後的源代碼在您的問題中添加附錄。 – WhozCraig

+0

...得到它的工作。在編譯之前,我只需要「清理」即可。謝謝,WhozCraig。 RE:「沒有任何收益......」我聽到你在說什麼。我是新來的C++ lang,所以我試圖確定什麼可行,爲什麼。您給我的鏈接似乎意味着將模板聲明從實現中分離出來總是很好,並且使用.tpp文件可以實現此目標。 – Otelagh