c++栈的这个输出操作符重载哪错了,一直报错。但也没显示哪行错

时间:2021-09-07 17:06:10

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


引用 1 楼  的回复:
代码没贴全,建议把main函数的内容及它所在的文件的文件名、Stack.h文件的内容、Stack.cpp文件的内容贴出来。

有点多
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;里面的笔误只是一个笔误而已。

#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


引用 3 楼  的回复:
缺singleList.h的内容。
缺linkNode的定义。
还是分析不出来。

我相信楼主的cout<<sc;里面的笔误只是一个笔误而已。

那时是笔误,程序里没错。好吧,那我贴完整,谢谢哈

#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


引用 4 楼  的回复:
函数参数类型匹配的问题。
提供一个我常用的方案:
C/C++ code

template <typename StrmT, typename T>
strmT&amp; operator<<(StrmT&amp; os,Stack<T>&amp; a){
    os<<"栈中元素个数:"<<a.getSize()<<endl;
    T x;
    linkNode<T>* p;
……

不是这个原因试了还是不行

现在我不用流重载,写个一个单独的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


引用 1 楼  的回复:
代码没贴全,建议把main函数的内容及它所在的文件的文件名、Stack.h文件的内容、Stack.cpp文件的内容贴出来。

有点多
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;里面的笔误只是一个笔误而已。

#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


引用 3 楼  的回复:
缺singleList.h的内容。
缺linkNode的定义。
还是分析不出来。

我相信楼主的cout<<sc;里面的笔误只是一个笔误而已。

那时是笔误,程序里没错。好吧,那我贴完整,谢谢哈

#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


引用 4 楼  的回复:
函数参数类型匹配的问题。
提供一个我常用的方案:
C/C++ code

template <typename StrmT, typename T>
strmT&amp; operator<<(StrmT&amp; os,Stack<T>&amp; a){
    os<<"栈中元素个数:"<<a.getSize()<<endl;
    T x;
    linkNode<T>* p;
……

不是这个原因试了还是不行

现在我不用流重载,写个一个单独的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),