【问题标题】:How to declare a friend function of a template inside a class and implement this friend function ouside class?如何在类中声明模板的友元函数并在类外实现该友元函数?
【发布时间】:2020-04-03 20:37:42
【问题描述】:

好吧,我正在尝试在我的第一个 C++ 堆栈上实现 copy_and_swap 习惯用法,因为我需要创建一个交换函数,并且这个交换函数需要是一个友元函数,我尝试通过这种方式来实现:

template <class T>
class Stack {
    private:
        int top;
        T* a;
        int MAX;

    public:
        Stack(int MAX);
        Stack(Stack<T>& s);
        bool push(T x);
        bool pop();
        T peek();
        bool isEmpty();
        friend void swap(Stack<T>& f, Stack<T>& s);
        ~Stack();
};

template <class T>
void Stack<T>::swap(Stack<T>& f, Stack<T>& s){
//I will put something where yet.
}

但是,VSCode 对交换功能这么说:类模型“Stack”没有“swap”成员(我翻译成英文,我的 VSCode 用葡萄牙语运行)。

如何在不收到此错误的情况下做到这一点?

【问题讨论】:

    标签: c++ templates stack swap friend


    【解决方案1】:

    你的朋友函数不是模板,所以要在外面定义,你必须为每种类型定义非模板函数(这似乎不切实际):

    void swap(Stack<int>& lhs, Stack<int>& rhs){/*..*/}
    void swap(Stack<char>& lhs, Stack<char>& rhs){/*..*/}
    void swap(Stack<MyType>& lhs, Stack<MyType>& rhs){/*..*/}
    

    更简单(更好的 IMO)是在类内部定义。

    template <class T>
    class Stack {
    // ...
        friend void swap(Stack& lhs, Stack& rhs) { /*..*/ };
    };
    

    另一种方法是制作朋友功能模板:

    template <class T> class Stack;
    template <class T> void swap(Stack<T>&, Stack<T>&);
    
    template <class T>
    class Stack {
    // ...
        friend void swap<>(Stack& f, Stack& s); // Only the specialization is friend
    };
    
    template <class T>
    void swap(Stack<T>& lhs, Stack<T>& rhs){ /**/ }
    

    【讨论】:

    • 感谢您的回答,这行得通。但是我在理解 C++ 编译器如何理解这一点时遇到了一点问题,他如何知道 void swap 属于没有 "Stack::" 的 Stack?
    • 我喜欢在课外实现功能,我的问题是如何在外面做,里面很容易做到(如你所说)。
    • 友元函数不属于类,所以没有Stack&lt;T&gt;::。
    • “模板 class Stack;”一开始真的有必要吗?如果是,它在这段代码中做了什么?没有他,VSCode 没有显示任何错误。
    • 这是一个(前向)声明,需要声明swap函数,该函数应该在类之前声明以允许该朋友声明。
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2020-08-07
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多