如何在 class 中声明一个模板的友元函数并在 class 之外实现这个友元函数?

How to declare a friend function of a template inside a class and implement this friend function ouside class?

好吧,我正在尝试在我的第一个 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 关于交换函数是这样说的:class 模型 "Stack " 没有 "swap" 成员(我翻译成英语,我的 VSCode 以葡萄牙语运行)。

如何在不收到此错误的情况下执行此操作?

你的友元函数不是模板,所以要在外部定义,你必须为每种类型定义非模板函数(这似乎不可行):

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)是在 class.

中定义
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){ /**/ }