[英]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.