C ++模板和朋友声明

时间:2011-04-09 21:55:58

标签: c++

有人能告诉我我的代码有什么问题。我猜我没有正确地重载<<,但我不确定如何修复它。

以下代码实现了一个简单的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;

}

4 个答案:

答案 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会是什么,将它传递给堆栈不是一个好主意。