我不知道此代码出了什么问题:
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>'
,所以我做错了什么,有人可以检查一下吗?
此
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+=
必须是非静态成员函数,所以最初的问题也消失了…