c++模板和友元声明
C++ templates and friend declaration
谁能告诉我我的代码有什么问题?我猜我没有正确地重载<<
,但我不确定如何修复它。
cout << si;
失效update:已完成建议的修改,但仍未编译。
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;
}
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);
应该是
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
。
你已经得到了你的答案,但是我可以建议你转向:
void push(T e)
为:
void push(const T& e)
在性能方面,因为你不知道T将是什么,并且在堆栈上传递它不是一个好主意。
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 类模板中文本运算符的友元声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 友元声明阻止外部函数访问类的私有部分
- C++:友元声明'声明一个非模板函数
- 友元声明及其表示的实体
- 嵌套类中需要前向声明的友元声明
- 多参数模板不能很好地处理友元声明
- 友元声明和显式模板实例化声明
- 为什么标准禁止部分专门化的友元声明
- is_constructible和is_destructibble不受友元声明的影响
- Pimpl习语和内部对象协作,无需友元声明
- C++中的友元声明-公共和私有之间的区别
- 单个成员而不是整个类的友元声明
- 关于 C++ 中友元声明的基本内容错误
- 有没有办法避免模板友元声明的外部可见性
- 如何解决c++中友元声明的循环依赖
- 指定默认实参的友元声明必须是定义