[英]C++ templates and friend declaration
谁能告诉我我的代码有什么问题。 我猜我没有正确地重载<<
,但是我不确定如何解决它。
下面的代码实现了一个简单的Stack容器。 它在cout << si;
处失败cout << si;
更新:提出了建议的更改,但仍未编译。
update2:知道了! 谢谢!
#include <iostream>
using namespace std;
template <typename T = int, int N = 10>
struct Stack
{
T elems[N];
unsigned int size;
Stack()
{
size=0;
}
void push(T e)
{
elems[size]=e;
size++;
}
T pop()
{
size--;
return elems[size];
}
template <typename T, int N>
friend ostream& operator << (ostream& os, const Stack<T, N> &stack);
};
template <typename T, int N>
ostream& operator << (ostream& os, const Stack<T, N> &stack)
{
for (unsigned int i=0; i<N; i++)
{
os << stack.elems[i];
}
return os;
}
int main()
{
Stack<> si;
si.push(3);
cout << si;
}
应该
ostream& operator << (ostream& os, const Stack<T,N> &stack);
// ^^ -- note this
在定义和声明中。
您需要在此处为堆栈完全指定所有模板参数:
template <typename T, int N>
ostream& operator<< (ostream& os, const Stack<T, N> &stack);
否则,编译器无法为您的重载流运算符推断出适当的N
template <typename T, int N>
ostream& operator << (ostream& os, const Stack<T> &stack)
该模板的问题在于,由于您正在使用默认模板参数作为Stack
参数,因此无法从两个函数参数中的任何一个推断参数N
查看您的实现,几乎可以肯定没有打算这样做,因为您使用N
作为循环绑定,而Stack<T>
有10个元素。 您可能打算写:
template <typename T, int N>
ostream& operator << (ostream& os, const Stack<T, N> &stack)
同样,您的朋友声明需要匹配模板,而朋友声明正在声明非模板朋友重载。
这将声明一个适当的朋友模板。
template< typename S, int M >
friend ostream& operator << (ostream& os, const Stack<S, M> &stack);
您已经得到了答案,但是我建议您转向:
void push(T e)
变成:
void push(const T& e)
对于性能而言,由于您不知道T将是什么,因此将其传递到堆栈上并不是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.