非模板类中的函数模板

22

我相信这是可能的,但我就是做不到:如何在非模板类中定义函数模板?我尝试过以下代码:

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)
{
}

但它不起作用。我收到了这个错误消息:

'Error 1 error C2768:'Stack_T :: put':明确模板参数的非法使用'
谢谢

1个回答

20
不要在函数名后面放置<T>。正确写法应该是这样的:
template<class T>
void Stack_T::put(const T& obj)
{
}

如果函数定义不在头文件中,这仍然无法工作。为了解决这个问题,请使用以下之一:

  • 将函数定义放在类的头文件中。
  • 在类后面的头文件中放置函数定义(就像您的示例代码中一样)。
  • 在头文件中使用显式模板实例化。但是这有严重的限制(您必须事先知道所有可能的T的值)。

1
我尝试过了,但是出现了一个错误:'错误1:LNK2019错误:未解析的外部符号“public: void __thiscall Stack_T::put<int>(int const &)”(??$put@H@Stack_T@@QAEXABH@Z),在函数_wmain Stack_of_Objects.obj中引用 - There is nothing we can do
模板<class T> void Stack_T<T>::put(const T& obj) { } - Harry
@Harry 不行,那样做不行。Stack_T 不是一个模板。 - interjay
非常感谢您的回答!这真的帮了我很多。不过,我该如何“使用显式模板实例化”?那实际上意味着什么? - M.Ionut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接