ostream& operator<<(ostream& os,Stack<T>& a){
os<<"栈中元素个数:"<<a.getSize()<<endl;
T x;
linkNode<T>* p;
p=top;
while(p!=NULL){
os<<p->data<<endl;
p=p->link;
}
return os;
}
调用
Stack<char> sc;
cou<<sc;
1>------ 已启动生成: 项目: stack, 配置: Debug Win32 ------
1>生成启动时间为 2012/10/14 11:59:20。
1>InitializeBuildStatus:
1> 正在创建“Debug\stack.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1> main.cpp
1> Stack.h
1> 正在生成代码...
1>d:\c++ workspace\stack\stack\calculator.h(35): warning C4715: “Calculator::isp”: 不是所有的控件路径都返回值
1>d:\c++ workspace\stack\stack\calculator.h(47): warning C4715: “Calculator::icp”: 不是所有的控件路径都返回值
1>Link:
1> LINK : 没有找到 D:\C++ workspace\stack\Debug\stack.exe 或上一个增量链接没有生成它;正在执行完全链接
1>main.obj : error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Stack<char>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$Stack@D@@@Z),该符号在函数 _main 中被引用
1>D:\C++ workspace\stack\Debug\stack.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:01.38
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
7 个解决方案
#1
代码没贴全,建议把
m
a
i
n
函
数
的
内
容
及
它
所
在
的
文
件
的
文
件
名、
S
t
a
c
k
.
h
文
件
的
内
容、
S
t
a
c
k
.
c
p
p
文
件
的
内
容贴出来。
#2
有点多
Stack.h
#ifndef Stack_h__
#define Stack_h__
#include<iostream>
#include"singleList.h"
using namespace std;
template <class T>
class Stack{
private:
linkNode<T>* top;
public:
Stack(){
top=NULL;
}
~Stack(){makeEmpty();}
bool push(T& x);
bool pop(T& x);
bool getTop(T& x);
bool isEmpty();
int getSize();
void makeEmpty();
friend ostream& operator<<(ostream& os,Stack<T> a);
};
template<class T>
bool Stack<T>::push(T& x){
top=new linkNode<T>(x,top);
if(top!=NULL)
return true;
else
return false;
}
template <class T>
bool Stack<T>::pop(T &x){
if(isEmpty()==true){
cerr<<"stack is Empty"<<endl;
return false;
}
linkNode<T>* p;
p=top;
x=p->data;
top=top->link;
delete p;
return true;
}
template <class T>
bool Stack<T>::getTop(T& x){
if(isEmpty()==true)
return false;
x=top->data;
return true;
}
template <class T>
bool Stack<T>::isEmpty(){
if(top==NULL)
return true;
else
return false;
}
template <class T>
void Stack<T>::makeEmpty(){
linkNode<T>* p;
while(top!=NULL){
p=top;
top=top->link;
delete p;
}
}
template<class T>
ostream& operator<<(ostream& os,Stack<T>& a){
os<<"栈中元素个数:"<<a.getSize()<<endl;
T x;
linkNode<T>* p;
p=a.top;
while(p!=NULL){
os<<p->data<<endl;
p=p->link;
}
return os;
}
#endif // Stack_h__
调用就是一句
Stack<char> sc;
cou<<sc;
这样就报错
#3
缺singleList.h的内容。
缺linkNode的定义。
还是分析不出来。
我相信楼主的cou t<<sc;里面的笔误只是一个笔误而已。
缺linkNode的定义。
还是分析不出来。
我相信楼主的cou t<<sc;里面的笔误只是一个笔误而已。
#4
函数参数类型匹配的问题。
提供一个我常用的方案:
提供一个我常用的方案:
template <typename StrmT, typename T>
strmT& operator<<(StrmT& os,Stack<T>& a){
os<<"栈中元素个数:"<<a.getSize()<<endl;
T x;
linkNode<T>* p;
p=top;
while(p!=NULL){
os<<p->data<<endl;
p=p->link;
}
return os;
}
#5
那时是笔误,程序里没错。好吧,那我贴完整,谢谢哈
#ifndef singleList_h__
#define singleList_h__
#include <iostream>
using namespace std;
template<class T>
class linkNode{
public:
linkNode(linkNode<T>* ptr=NULL){
link=ptr;
}
linkNode(T& x,linkNode<T>* ptr=NULL){
data=x;
link=ptr;
}
T data;
linkNode* link;
};
template<class T>
class List:public linkNode<T>{
protected:
linkNode<T>* first;
public:
List();
List(T& x);
List(List<T>& L);
~List();
void makeEmpty();
int length();
linkNode<T>* getHead();
linkNode<T>* search(T& x);
linkNode<T>* locate(int i);
bool getData(int i,T& x);
void setData(int i,T& x);
bool insert(int i,T& x);
bool remove(int i,T& x);
bool isEmpty();
void sort();
bool headInsert(T& x);
List<T>& operator==(List<T>& L);
void reverse();
};
template<class T>
List<T>::List(){
first=new linkNode<T>();
}
template<class T>
List<T>::List(T& x){
first=new linkNode<T>(x);
}
template<class T>
List<T>::List(List<T>& L){
List<T>* newList;
linkNode<T>* newNode;
linkNode<T>* current;
current=first->link;
newList->first=first;
while (current->link!=NULL)
{
newNode->data=current->data;
newNode->link=current->link;
current=current->link;
newNode=newNode->link;
}
}
template<class T>
List<T>::~List(){
makeEmpty();
}
template<class T>
void List<T>::makeEmpty(){
linkNode<T>* del;
while(first->link!=NULL){
del=first->link;
first->link=del->link;
delete del;
}
}
template<class T>
int List<T>::length(){
linkNode<T>* q=first;
int count=0;
while(q->link!=NULL){
count++;
q=q->link;
}
return count;
}
template<class T>
linkNode<T>* List<T>::getHead(){
return first->link;
}
template<class T>
linkNode<T>* List<T>::search(T& x){
linkNode<T>* current;
current=first->link;
while(current->link!=NULL){
if(current->data==x)
break;
current=current->link;
}
return current;
}
template<class T>
linkNode<T>* List<T>::locate(int i){
linkNode<T>* current;
current=first;
for (int j=0;j<i;j++)
{
if(current!=NULL && current->link!=NULL)
current=current->link;
}
return current;
}
template<class T>
bool List<T>::getData(int i,T& x){
linkNode<T>* a;
a=locate(i);
if (a!=NULL)
{
x=a->data;
return true;
}
return false;
}
template<class T>
void List<T>::setData(int i,T& x){
locate(i)->data=x;
}
template<class T>
bool List<T>::insert(int i,T& x){
linkNode<T>* newNode=new linkNode<T>(x);
if(newNode==NULL)
cerr<<"error"<<endl;
linkNode<T>* current;
current=locate(i);
if(current==NULL)
return false;
else{
newNode->link=current->link;
current->link=newNode;
}
return true;
}
template<class T>
bool List<T>::remove(int i,T& x){
linkNode<T>* current;
linkNode<T>* del;
current=locate(i-1);
if(current==NULL)
return false;
del=current->link;
current->link=del->link;
x=del->data;
delete del;
return true;
}
template<class T>
bool List<T>::isEmpty(){
if(first->link==NULL)
return true;
else
return false;
}
template<class T>
bool List<T>::headInsert(T& x){
linkNode<T>* newNode=new linkNode<T>(x);
if(newNode==NULL){
cerr<<"error";
return false;
}
newNode->link=first->link;
first->link=newNode;
return true;
}
template<class T>
void List<T>::reverse(){
linkNode<T>* q=first->link;
first->link=NULL;
while (q!=NULL){
headInsert(q->data);
q=q->link;
}
}
#endif // singleList_h__
#6
不是这个原因试了还是不行
现在我不用流重载,写个一个单独的out函数还是报外部命令错误。。应该不是重载的原因。。好奇怪额
#7
friend ostream& operator<<(ostream& os,Stack<T> a);
改为
friend ostream& operator<<(ostream& os,Stack<T>& a);试试
class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &, class Stack<char>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$Stack@D@@@Z),
#1
代码没贴全,建议把
m
a
i
n
函
数
的
内
容
及
它
所
在
的
文
件
的
文
件
名、
S
t
a
c
k
.
h
文
件
的
内
容、
S
t
a
c
k
.
c
p
p
文
件
的
内
容贴出来。
#2
有点多
Stack.h
#ifndef Stack_h__
#define Stack_h__
#include<iostream>
#include"singleList.h"
using namespace std;
template <class T>
class Stack{
private:
linkNode<T>* top;
public:
Stack(){
top=NULL;
}
~Stack(){makeEmpty();}
bool push(T& x);
bool pop(T& x);
bool getTop(T& x);
bool isEmpty();
int getSize();
void makeEmpty();
friend ostream& operator<<(ostream& os,Stack<T> a);
};
template<class T>
bool Stack<T>::push(T& x){
top=new linkNode<T>(x,top);
if(top!=NULL)
return true;
else
return false;
}
template <class T>
bool Stack<T>::pop(T &x){
if(isEmpty()==true){
cerr<<"stack is Empty"<<endl;
return false;
}
linkNode<T>* p;
p=top;
x=p->data;
top=top->link;
delete p;
return true;
}
template <class T>
bool Stack<T>::getTop(T& x){
if(isEmpty()==true)
return false;
x=top->data;
return true;
}
template <class T>
bool Stack<T>::isEmpty(){
if(top==NULL)
return true;
else
return false;
}
template <class T>
void Stack<T>::makeEmpty(){
linkNode<T>* p;
while(top!=NULL){
p=top;
top=top->link;
delete p;
}
}
template<class T>
ostream& operator<<(ostream& os,Stack<T>& a){
os<<"栈中元素个数:"<<a.getSize()<<endl;
T x;
linkNode<T>* p;
p=a.top;
while(p!=NULL){
os<<p->data<<endl;
p=p->link;
}
return os;
}
#endif // Stack_h__
调用就是一句
Stack<char> sc;
cou<<sc;
这样就报错
#3
缺singleList.h的内容。
缺linkNode的定义。
还是分析不出来。
我相信楼主的cou t<<sc;里面的笔误只是一个笔误而已。
缺linkNode的定义。
还是分析不出来。
我相信楼主的cou t<<sc;里面的笔误只是一个笔误而已。
#4
函数参数类型匹配的问题。
提供一个我常用的方案:
提供一个我常用的方案:
template <typename StrmT, typename T>
strmT& operator<<(StrmT& os,Stack<T>& a){
os<<"栈中元素个数:"<<a.getSize()<<endl;
T x;
linkNode<T>* p;
p=top;
while(p!=NULL){
os<<p->data<<endl;
p=p->link;
}
return os;
}
#5
那时是笔误,程序里没错。好吧,那我贴完整,谢谢哈
#ifndef singleList_h__
#define singleList_h__
#include <iostream>
using namespace std;
template<class T>
class linkNode{
public:
linkNode(linkNode<T>* ptr=NULL){
link=ptr;
}
linkNode(T& x,linkNode<T>* ptr=NULL){
data=x;
link=ptr;
}
T data;
linkNode* link;
};
template<class T>
class List:public linkNode<T>{
protected:
linkNode<T>* first;
public:
List();
List(T& x);
List(List<T>& L);
~List();
void makeEmpty();
int length();
linkNode<T>* getHead();
linkNode<T>* search(T& x);
linkNode<T>* locate(int i);
bool getData(int i,T& x);
void setData(int i,T& x);
bool insert(int i,T& x);
bool remove(int i,T& x);
bool isEmpty();
void sort();
bool headInsert(T& x);
List<T>& operator==(List<T>& L);
void reverse();
};
template<class T>
List<T>::List(){
first=new linkNode<T>();
}
template<class T>
List<T>::List(T& x){
first=new linkNode<T>(x);
}
template<class T>
List<T>::List(List<T>& L){
List<T>* newList;
linkNode<T>* newNode;
linkNode<T>* current;
current=first->link;
newList->first=first;
while (current->link!=NULL)
{
newNode->data=current->data;
newNode->link=current->link;
current=current->link;
newNode=newNode->link;
}
}
template<class T>
List<T>::~List(){
makeEmpty();
}
template<class T>
void List<T>::makeEmpty(){
linkNode<T>* del;
while(first->link!=NULL){
del=first->link;
first->link=del->link;
delete del;
}
}
template<class T>
int List<T>::length(){
linkNode<T>* q=first;
int count=0;
while(q->link!=NULL){
count++;
q=q->link;
}
return count;
}
template<class T>
linkNode<T>* List<T>::getHead(){
return first->link;
}
template<class T>
linkNode<T>* List<T>::search(T& x){
linkNode<T>* current;
current=first->link;
while(current->link!=NULL){
if(current->data==x)
break;
current=current->link;
}
return current;
}
template<class T>
linkNode<T>* List<T>::locate(int i){
linkNode<T>* current;
current=first;
for (int j=0;j<i;j++)
{
if(current!=NULL && current->link!=NULL)
current=current->link;
}
return current;
}
template<class T>
bool List<T>::getData(int i,T& x){
linkNode<T>* a;
a=locate(i);
if (a!=NULL)
{
x=a->data;
return true;
}
return false;
}
template<class T>
void List<T>::setData(int i,T& x){
locate(i)->data=x;
}
template<class T>
bool List<T>::insert(int i,T& x){
linkNode<T>* newNode=new linkNode<T>(x);
if(newNode==NULL)
cerr<<"error"<<endl;
linkNode<T>* current;
current=locate(i);
if(current==NULL)
return false;
else{
newNode->link=current->link;
current->link=newNode;
}
return true;
}
template<class T>
bool List<T>::remove(int i,T& x){
linkNode<T>* current;
linkNode<T>* del;
current=locate(i-1);
if(current==NULL)
return false;
del=current->link;
current->link=del->link;
x=del->data;
delete del;
return true;
}
template<class T>
bool List<T>::isEmpty(){
if(first->link==NULL)
return true;
else
return false;
}
template<class T>
bool List<T>::headInsert(T& x){
linkNode<T>* newNode=new linkNode<T>(x);
if(newNode==NULL){
cerr<<"error";
return false;
}
newNode->link=first->link;
first->link=newNode;
return true;
}
template<class T>
void List<T>::reverse(){
linkNode<T>* q=first->link;
first->link=NULL;
while (q!=NULL){
headInsert(q->data);
q=q->link;
}
}
#endif // singleList_h__
#6
不是这个原因试了还是不行
现在我不用流重载,写个一个单独的out函数还是报外部命令错误。。应该不是重载的原因。。好奇怪额
#7
friend ostream& operator<<(ostream& os,Stack<T> a);
改为
friend ostream& operator<<(ostream& os,Stack<T>& a);试试
class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &, class Stack<char>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$Stack@D@@@Z),