Как объявить функцию друга шаблона внутри класса и реализовать эту функцию класса друга? - PullRequest
0 голосов
/ 03 апреля 2020

Ну, я пытаюсь реализовать идиому copy_and_swap в моем первом стеке в C ++, для этого мне нужно создать функцию подкачки, а эта функция подкачки должна быть функцией-другом, я попытался сделать это следующим образом:

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" (я перевожу на Engli sh, мой VSCode работает на португальском).

Как я могу это сделать без получения этой ошибки?

1 Ответ

1 голос
/ 03 апреля 2020

Ваша функция друга не является шаблоном, поэтому для определения извне вы должны определить функцию не шаблона для каждого типа (что кажется неосуществимым):

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

Проще (и лучше ИМО) определите внутри класса.

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){ /**/ }
...