簡體   English   中英

C ++模板和朋友聲明

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM