2009-11-25 154 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文件中,与具体的类一样,我忘记了模板的故事有点不同,要做到这一点,必须使用包含或分离模型,这是我忘记的。再次感谢你,我很抱歉打扰。