关于c++模板类运算符重载在vs2015下编译无法通过的困惑

includeios 2017-03-24 01:57:03
#include "stdafx.h"
#include<iostream>
#include<cassert>
using namespace std;
template<typename T>class stack {
int top;
T *elements;
int maxsize;
public:
stack(int = 20);
~stack() { delete[]elements; }
void push(const T&x);
T pop();
T getelem(int i);
void makeempty() { top = -1; }
bool isempty()const { return top == -1; }
bool isfull()const { return top == maxsize - 1; }
friend ostream &operator<<(ostream&, const stack<T>&);//T必不可少
};
template<typename T>stack<T>::stack(int max) {
maxsize = max;
top = -1;
elements = new T[maxsize];
assert(elements != 0);
}
template<typename T> ostream& operator<<(ostream& s, const stack<T>& s1) {//T必不可少
for (int i = 0; i <= s1.top; i++) s << s1.elements[i] << ' ';
s << endl;
return s;
}
template<typename T>void stack<T>::push(const T&data) {
assert(!isfull());
elements[++top] = data;
}
template<typename T>T stack<T>::pop() {
assert(!isempty());
return elements[top--];
}
template<typename T>T stack<T>::getelem(int i) {
assert(i <= top&&i >= 0);
return elements[i];
}
void main()
{
stack<int> s;
s.push(1);
cout << s << endl;
}
这一段代码在vs2015编译无法通过,但是在vc6.0中编译可以通过,可以运行,求高人相助,告诉我为什么。
...全文
219 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
includeios 2017-03-24
  • 打赏
  • 举报
回复
引用 4楼lilillos 的回复:
[quote=引用 3 楼 includeios 的回复:] [quote=引用 2楼lilillos 的回复:]问题出在 operator<< 这个符号重载上面,vs2015连接时找不到 这个函数定义了。关于友元函数和类模板的问题,c++prime上有,规则有点麻烦,楼主可以自己翻一下。也可以看一下这篇博客 http://blog.csdn.net/u010003835/article/details/47174127
//#include "stdafx.h"
#include<iostream>
#include<cassert>
using namespace std;

//注意这些
template<typename T>
class stack;

template<class T>  
ostream& operator<<(ostream& output, const stack<T>&a); 
///

template<typename T>class stack {
	int top;
	T *elements;
	int maxsize;
public:
	stack(int = 20);
	~stack() { delete[]elements; }
	void push(const T&x);
	T pop();
	T getelem(int i);
	void makeempty() { top = -1; }
	bool isempty()const { return top == -1; }
	bool isfull()const { return top == maxsize - 1; }

	//注意 操作符 后 的<T>
	friend ostream &operator<< <T>(ostream&, const stack<T>&);
};

template<typename T>stack<T>::stack(int max) {
	maxsize = max;
	top = -1;
	elements = new T[maxsize];
	assert(elements != 0);
}

//没有什么改变
template<typename T> 
ostream& operator<<(ostream& s, const stack<T>& s1) 
{
	for (int i = 0; i <= s1.top; i++) s << s1.elements[i] << ' ';
	s << endl;
	return s;
}
template<typename T>void stack<T>::push(const T&data) {
	assert(!isfull());
	elements[++top] = data;
}
template<typename T>T stack<T>::pop() {
	assert(!isempty());
	return elements[top--];
}
template<typename T>T stack<T>::getelem(int i) {
	assert(i <= top&&i >= 0);
	return elements[i];
}
int main()
{
	stack<int> s;
	s.push(1);
	cout<< s << endl;
	system("pause");
	return 0;
}
谢谢[/quote] 不用谢,尽量不要用vc6。因为它似乎是在第一个c++标准出来之前,就已经发布了。使用vs2015就很好。[/quote]好的
lilillos 2017-03-24
  • 打赏
  • 举报
回复
引用 3 楼 includeios 的回复:
[quote=引用 2楼lilillos 的回复:]问题出在 operator<< 这个符号重载上面,vs2015连接时找不到 这个函数定义了。关于友元函数和类模板的问题,c++prime上有,规则有点麻烦,楼主可以自己翻一下。也可以看一下这篇博客 http://blog.csdn.net/u010003835/article/details/47174127
//#include "stdafx.h"
#include<iostream>
#include<cassert>
using namespace std;

//注意这些
template<typename T>
class stack;

template<class T>  
ostream& operator<<(ostream& output, const stack<T>&a); 
///

template<typename T>class stack {
	int top;
	T *elements;
	int maxsize;
public:
	stack(int = 20);
	~stack() { delete[]elements; }
	void push(const T&x);
	T pop();
	T getelem(int i);
	void makeempty() { top = -1; }
	bool isempty()const { return top == -1; }
	bool isfull()const { return top == maxsize - 1; }

	//注意 操作符 后 的<T>
	friend ostream &operator<< <T>(ostream&, const stack<T>&);
};

template<typename T>stack<T>::stack(int max) {
	maxsize = max;
	top = -1;
	elements = new T[maxsize];
	assert(elements != 0);
}

//没有什么改变
template<typename T> 
ostream& operator<<(ostream& s, const stack<T>& s1) 
{
	for (int i = 0; i <= s1.top; i++) s << s1.elements[i] << ' ';
	s << endl;
	return s;
}
template<typename T>void stack<T>::push(const T&data) {
	assert(!isfull());
	elements[++top] = data;
}
template<typename T>T stack<T>::pop() {
	assert(!isempty());
	return elements[top--];
}
template<typename T>T stack<T>::getelem(int i) {
	assert(i <= top&&i >= 0);
	return elements[i];
}
int main()
{
	stack<int> s;
	s.push(1);
	cout<< s << endl;
	system("pause");
	return 0;
}
谢谢[/quote] 不用谢,尽量不要用vc6。因为它似乎是在第一个c++标准出来之前,就已经发布了。使用vs2015就很好。
includeios 2017-03-24
  • 打赏
  • 举报
回复
引用 2楼lilillos 的回复:
问题出在 operator<< 这个符号重载上面,vs2015连接时找不到 这个函数定义了。关于友元函数和类模板的问题,c++prime上有,规则有点麻烦,楼主可以自己翻一下。也可以看一下这篇博客 http://blog.csdn.net/u010003835/article/details/47174127
//#include "stdafx.h"
#include<iostream>
#include<cassert>
using namespace std;

//注意这些
template<typename T>
class stack;

template<class T>  
ostream& operator<<(ostream& output, const stack<T>&a); 
///

template<typename T>class stack {
	int top;
	T *elements;
	int maxsize;
public:
	stack(int = 20);
	~stack() { delete[]elements; }
	void push(const T&x);
	T pop();
	T getelem(int i);
	void makeempty() { top = -1; }
	bool isempty()const { return top == -1; }
	bool isfull()const { return top == maxsize - 1; }

	//注意 操作符 后 的<T>
	friend ostream &operator<< <T>(ostream&, const stack<T>&);
};

template<typename T>stack<T>::stack(int max) {
	maxsize = max;
	top = -1;
	elements = new T[maxsize];
	assert(elements != 0);
}

//没有什么改变
template<typename T> 
ostream& operator<<(ostream& s, const stack<T>& s1) 
{
	for (int i = 0; i <= s1.top; i++) s << s1.elements[i] << ' ';
	s << endl;
	return s;
}
template<typename T>void stack<T>::push(const T&data) {
	assert(!isfull());
	elements[++top] = data;
}
template<typename T>T stack<T>::pop() {
	assert(!isempty());
	return elements[top--];
}
template<typename T>T stack<T>::getelem(int i) {
	assert(i <= top&&i >= 0);
	return elements[i];
}
int main()
{
	stack<int> s;
	s.push(1);
	cout<< s << endl;
	system("pause");
	return 0;
}
谢谢
lilillos 2017-03-24
  • 打赏
  • 举报
回复
问题出在 operator<< 这个符号重载上面,vs2015连接时找不到 这个函数定义了。关于友元函数和类模板的问题,c++prime上有,规则有点麻烦,楼主可以自己翻一下。也可以看一下这篇博客 http://blog.csdn.net/u010003835/article/details/47174127
//#include "stdafx.h"
#include<iostream>
#include<cassert>
using namespace std;

//注意这些
template<typename T>
class stack;

template<class T>  
ostream& operator<<(ostream& output, const stack<T>&a); 
///

template<typename T>class stack {
	int top;
	T *elements;
	int maxsize;
public:
	stack(int = 20);
	~stack() { delete[]elements; }
	void push(const T&x);
	T pop();
	T getelem(int i);
	void makeempty() { top = -1; }
	bool isempty()const { return top == -1; }
	bool isfull()const { return top == maxsize - 1; }

	//注意 操作符 后 的<T>
	friend ostream &operator<< <T>(ostream&, const stack<T>&);
};

template<typename T>stack<T>::stack(int max) {
	maxsize = max;
	top = -1;
	elements = new T[maxsize];
	assert(elements != 0);
}

//没有什么改变
template<typename T> 
ostream& operator<<(ostream& s, const stack<T>& s1) 
{
	for (int i = 0; i <= s1.top; i++) s << s1.elements[i] << ' ';
	s << endl;
	return s;
}
template<typename T>void stack<T>::push(const T&data) {
	assert(!isfull());
	elements[++top] = data;
}
template<typename T>T stack<T>::pop() {
	assert(!isempty());
	return elements[top--];
}
template<typename T>T stack<T>::getelem(int i) {
	assert(i <= top&&i >= 0);
	return elements[i];
}
int main()
{
	stack<int> s;
	s.push(1);
	cout<< s << endl;
	system("pause");
	return 0;
}
includeios 2017-03-24
  • 打赏
  • 举报
回复
在重载<<运算符的函数中,<<后加上<>就可以,这是为什么??

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧