有人能告诉我我的代码有什么问题。我猜我没有正确地重载<<
,但我不确定如何修复它。
以下代码实现了一个简单的Stack容器。它在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;
}
答案 0 :(得分:1)
应该是
ostream& operator << (ostream& os, const Stack<T,N> &stack);
// ^^ -- note this
在定义和声明中。
答案 1 :(得分:0)
您需要在此处完全指定堆栈的所有模板参数:
template <typename T, int N>
ostream& operator<< (ostream& os, const Stack<T, N> &stack);
另外,编译器无法为重载的流操作符推断出正确的N
。
答案 2 :(得分:0)
template <typename T, int N>
ostream& operator << (ostream& os, const Stack<T> &stack)
此模板的问题是无法从任何一个函数参数推断出参数N
,因为您正在使用Stack
参数的默认模板参数。
看看你的实现,你几乎肯定不会这样,因为你使用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);
答案 3 :(得分:0)
你已经得到了答案,但我可以建议转向:
void push(T e)
成:
void push(const T& e)
表现性能方面,因为你不知道T会是什么,将它传递给堆栈不是一个好主意。