[C ++重载operator +,使用类和int参数作为模板

问题描述 投票:1回答:1

我不知道此代码出了什么问题:

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));
    ...
};

关键是我已经将类与操作员之间的友谊设置好了,而我仍然得到error: 'append' is a private member of 'Stack<char, 100>',所以我做错了什么,有人可以检查一下吗?

c++ operator-overloading friend
1个回答
1
投票

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

声明一个operator+函数模板,该函数模板将T类型的值,int类型的值和另一个int类型的值作为模板参数作为您的类模板的朋友。请注意,您声明为好友的函数模板与在Stack定义上方声明的模板不同。模板参数列表不同。在Stack的定义f上方,声明:

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+模板成为班级模板Stack的朋友…

除了所有这些,我建议您就此停下来,考虑一下像这样的表达式是否真的是个好主意

a + b

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

© www.soinside.com 2019 - 2024. All rights reserved.