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+=
必须是非静态成员函数,因此您最初的问题也消失了……
我不知道这段代码有什么问题:
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+=
必须是非静态成员函数,因此您最初的问题也消失了……