2009-11-25 176 views
9

我確定它是可能的,但我不能做到這一點,即:如何在非模板類中定義函數模板?我嘗試過這樣的事情:非模板類中的函數模板

class Stack_T 
{ 
    private: 
     void* _my_area; 
     static const int _num_of_objects = 10; 

    public: 
     // Allocates space for objects added to stack 
     explicit Stack_T(size_t); 
     virtual ~Stack_T(void); 

     // Puts object onto stack 
     template<class T> 
     void put(const T&); 

     // Gets last added object to the stack 
     template<class T> 
     T& get()const; 

     // Removes last added object from the stack 
     template<class T> 
     void remove(const T&); 
}; 

template<class T> //SOMETHING WRONG WITH THIS DEFINITION 
void Stack_T::put<T>(const T& obj) 
{ 
} 

但它不起作用。我得到這個錯誤消息:

「錯誤1錯誤C2768:‘Stack_T ::把’:非法使用顯式模板參數」
謝謝

回答

9

不要把<T>函數名後。這應該工作:

template<class T> 
void Stack_T::put(const T& obj) 
{ 
} 

編輯

如果函數定義是不是在頭文件中這仍然是行不通的。要解決此問題,請使用以下項目之一:

  • 將函數定義放入類中的頭文件中。
  • 將函數定義放在類之後的頭文件中(就像在你的示例代碼中一樣)。
  • 在頭文件中使用顯式模板實例。雖然這有很大的侷限性(你必須事先知道T的所有可能的值)。
+0

我tryied這一點,但我得到一個錯誤: 「錯誤錯誤LNK2019:無法解析的外部符號 「市民:無效__thiscall Stack_T ::把(INT常量和)」(?? $放3 H @ Stack_T @@ QAEXABH @ Z)在函數_wmain中引用\t Stack_of_Objects.obj ' – 2009-11-25 19:56:24

0

向所有嘗試過的人提供的信息可以幫助我解決這個問題。我把主要的錯誤包括在主要的.h文件中,與具體的類一樣,我忘記了模板的故事有點不同,要做到這一點,必須使用包含或分離模型,這是我忘記的。再次感謝你,我很抱歉打擾。