C++ 使用 class 和 int 参数作为模板重载 operator+

C++ overloading operator+ using a class and a int parameter as template

我不知道这段代码有什么问题:

template <class T = char, int num = 100> class Stack;
template <class T = char, int num1 = 100, int num2 = 100> Stack<T, num1>& operator+=(Stack<T, num1>& s1, const Stack<T, num2>& s2);
template <class T, int num>
class Stack{
template <T, int num1, int num2 > friend  Stack<T, num1>& operator+=(Stack<T, num1>& s1, const Stack<T, num2>& s2);
public:
   ...
private:
   Entry* first;
   class Entry{
      ...
   }
   void append(const Stack& s){
        if(isEmpty()) first = &s;
        else first->last().next = &s;
   }
   ...
};
template <class T, int num1, int num2>
Stack<T, num1>& operator+=(Stack<T, num1>& s1, const Stack<T, num2>& s2){
    s1.append(Stack<T, num2>(s2));
    ...
};

关键是我已经设置了从 class 到操作员的友谊,但我仍然得到 error: 'append' is a private member of 'Stack<char, 100>' 所以我做错了什么,有人可以吗请检查这个?

这个

template <T, int num1, int num2 > friend  Stack<T, num1>& operator+(Stack<T, num1>& s1, const Stack<T, num2>& s2);

声明了一个 operator+ 函数模板,它接受一个 T 类型的值、一个 int 类型的值和另一个 int 类型的值作为模板参数作为您的 class 模板的朋友。请注意,您声明为 friend 的函数模板不是您在 Stack 定义上方声明的那个。模板参数列表不同。在 Stack 的定义之上,你声明:

template <class T, int num1, int num2>
//           ^ type parameter
Stack<T, num1>& operator+(Stack<T, num1>& s1, const Stack<T, num2>& s2);

但在好友声明中你声明

template <T, int num1, int num2>
//        ^ non-type parameter
Stack<T, num1>& operator+(Stack<T, num1>& s1, const Stack<T, num2>& s2);

你必须写

template <class U, int num1, int num2> friend Stack<U, num1>& operator+(Stack<U, num1>& s1, const Stack<U, num2>& s2);

使您的原始 operator+ 模板成为 class 模板的朋友 Stack

除此之外,我建议您就此打住,想想像

这样的表达式是否真的是个好主意
a + b

隐式修改 a。如果您真的必须为此使用运算符,operator+= 可能是表达这些语义的更好方式(就个人而言,我可能只是坚持使用追加函数)。由于 operator+= 必须是非静态成员函数,因此您最初的问题也消失了……