【问题标题】:Function template in non-template class非模板类中的函数模板
【发布时间】:2010-12-20 10:39:37
【问题描述】:

我确定这是可能的,但我就是做不到,即:如何在非模板类中定义函数模板?我尝试过这样的事情:

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::put':非法使用显式模板参数'
谢谢

【问题讨论】:

    标签: c++ function templates


    【解决方案1】:

    不要在函数名后面加上&lt;T&gt;。这应该有效:

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

    如果函数定义不在头文件中,这仍然不起作用。要解决此问题,请使用以下之一:

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

    【讨论】:

    • 我尝试了这个,但我收到一个错误:'错误 1 ​​错误 LNK2019:未解析的外部符号“public:void __thiscall Stack_T::put(int const &)”(??$ put@H@Stack_T@@QAEXABH@Z) 在函数_wmain Stack_of_Objects.obj'中引用'
    • 模板 void Stack_T::put(const T& obj) { }
    • @Harry 不,那行不通。 Stack_T 不是模板。
    • 非常感谢您的回答!这真的帮助了我。不过,我将如何“使用显式模板实例化”?这实际上意味着什么?
    猜你喜欢
    • 2011-06-07
    • 2012-03-02
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多