青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
Tauruser
Enjoy Every Day
posts - 34, comments - 95, trackbacks - 0, articles - 5
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
為什么在VS2005重載輸出運算符那么難?
Posted on 2006-03-14 23:48
Tauruser
閱讀(1709)
評論(7)
編輯
收藏
引用
所屬分類:
算法與數據結構
最近在VS2005下實現一個模版堆棧時,想重載一下輸出運算符。結果老是遇到問題,如何都過不去,想不想去都不明白。還望高手指教。
一開始同樣的程序在VC2005和VC6.0下編譯都沒問題,但是一到鏈接的時候就出現問題了。都提示如下錯誤:
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 SegStack<int> const &)
"
(
??
6
@YAAAV
?
$basic_ostream@DU
?
$char_traits@D@std@@@std@@AAV01@ABV
?
$SegStack@H@@@Z),該符號在函數 _main 中被引用
死活都運行不了。后來發現如果在程序中不使用“cout<<”重載的運算符進行輸出,在兩個平臺下都沒有問題。可以重載的方式我已經全部按語法寫了。
今晚,又在VC6.0下再生成一次,奇跡般成功了。(PS:難道今晚的RP比較高 ^-^)但是還是沒有解決在VC2005下的問題,還是提示如上錯誤,VC2005到底還改了什么,與VC6.0不同了?一模一樣的程序,為什么在VC2005下都不行,在VC2005下的重載輸入輸出應該如何應該如何?
下面貼一下例程,麻煩有時候的大牛幫我看一下,很簡單的一個程序。
Ex2_2.rar
里面有三個文件分別如下:(ex2_2.cpp,stack.cpp,stack.h)下面貼一下文件的內容。
/**/
/////////
/ex2_2.cpp
/////////
//
//////////////////////////////
#include
"
stack.cpp
"
SegStack
<
int
>
iStack(
10
);
int
main()
{
for
(
int
i(
0
);i
<
10
;i
++
)
iStack.push(i);
cout
<<
iStack;
iStack.output(cout);
for
(i
=
0
;i
<
5
;i
++
)
iStack.pop();
cout
<<
iStack;
return
0
;
}
/**/
/////////
//stack.h
/////////
/
//////////////////////////////
/
#ifndef stack_h_
#define
stack_h_
#include
<
iostream
>
using
namespace
std;
template
<
class
T
>
class
stack
{
public
:
virtual
void
push(
const
T
&
x)
=
0
;
virtual
void
pop()
=
0
;
virtual
T Top()
const
=
0
;
virtual
bool
IsEmpty()
const
=
0
;
virtual
bool
IsFull()
const
=
0
;
}
;
template
<
class
T
>
class
SegStack:
public
stack
<
T
>
{
public
:
SegStack(
int
mSize);
~
SegStack();
bool
IsEmpty()
const
;
bool
IsFull()
const
;
void
push(
const
T
&
x);
void
pop();
T Top()
const
;
friend ostream
&
operator
<<
(ostream
&
out
,
const
SegStack
<
T
>&
seg);
void
output(ostream
&
out
)
const
;
private
:
T
*
s;
int
maxSize;
int
top;
}
;
#endif
/**/
////////////
stack.cpp
////////////
/////////////////////////////////
//
#include
"
stack.h
"
template
<
class
T
>
SegStack
<
T
>
::SegStack(
int
mSize):top(
-
1
)
{
maxSize
=
mSize;
s
=
new
T[maxSize];
}
template
<
class
T
>
SegStack
<
T
>
::
~
SegStack()
{
delete []s;
}
template
<
class
T
>
bool
SegStack
<
T
>
::IsFull()
const
{
return
(top
==
(maxSize
-
1
));
}
template
<
class
T
>
bool
SegStack
<
T
>
::IsEmpty()
const
{
return
(top
==-
1
);
}
template
<
class
T
>
void
SegStack
<
T
>
::push(
const
T
&
x)
{
if
(IsFull())
{
cout
<<
"
The stack is full
"
<<
endl;
}
else
{
s[
++
top]
=
x;
}
}
template
<
class
T
>
void
SegStack
<
T
>
::pop()
{
if
(IsEmpty())
{
cout
<<
"
The stack is empty
"
<<
endl;
}
else
{
top
--
;
}
}
template
<
class
T
>
T SegStack
<
T
>
::Top()
const
{
return
s[top];
}
template
<
class
T
>
void
SegStack
<
T
>
::output(ostream
&
out
)
const
{
out
<<
"
The stack list is:
"
;
for
(
int
i(
0
);i
<=
top;i
++
)
out
<<
"
"
<<
s[i];
out
<<
endl;
}
template
<
class
T
>
ostream
&
operator
<<
(ostream
&
out
,
const
SegStack
<
T
>&
seg)
{
out
<<
"
The stack list is:
"
;
for
(
int
i(
0
);i
<=
seg.top;i
++
)
out
<<
"
"
<<
seg.s[i];
out
<<
endl;
//
seg.output(out);
return
out
;
}
在最后,我還想問的一個問題是:為什么在ex2_2.cpp里#include "stack.h"時會無法編譯通過,而#include "stack.cpp"時就可以了呢?
記得我剛學C++的時候,老師跟我說把頭文件和源程序文件分開,最主要的是要進行知識產權保護,當你寫好一個子程序時,發布就不要給對方源程序,只要給對方頭文件和編譯過來的相應obj文件就可以了。但是從上面的例子上看來,如果不#include "stack.cpp"就無法編譯通過,這不就代表一定要給源程序對方嗎?為什么會這樣子的。我應該如何做呢?如果我想實現源程序的保存。
Feedback
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2006-03-15 01:16 by
dhong
class SegStack里面這么寫:
template < class T1 >
friend ostream& operator << (ostream& out,const SegStack<T1>& seg);
這個operator不是SegStack的成員,因此不多寫一個template這個operator就不是template的了
template的申明和定義一般都放入.h中,而不是.cpp,原因之一是template需要被實例化時必須保證編譯器能找到實現
反過來想,如果template的定義都在.cpp中,那這個cpp被編譯時至多產生一種T的實現(多半不會產生實際代碼,編譯器根本無從知曉T到底是什么類型),那么不妨假設其他cpp中有至少兩種不同的T,那么編譯器該如何連接呢?呵呵
因此目前為止,幾乎所有編譯器都要求需要展開template時能找到定義,于是形成了template定義不放在.cpp中的慣例
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2006-03-15 12:03 by
Tauruser
真的可以了,困撓我一個星期的問題終于解決了,順便再問一下,為什么在VC6.0里不用再多加一個template <class T1>也可以成功運行呢?
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2006-03-15 21:16 by
dhong
不知道,這個要問ms,呵呵。vc6誕生的年代,c++標準關于模版的規定還很不完善,vc6出現一些令人難以理解的問題不必深究,對模板使用比較多的應用,多使用對c++98支持比較好的編譯器較好,比如g++、vc71 above
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2006-03-17 11:07 by
jemmy
VC6 對C++標準支持不好,2003/2005卻支持的很好
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2006-03-19 21:25 by
Ninputer
可以把export template放在CPP里,然后把template放到h里。不過這一特性還沒有發現支持的編譯器……
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2007-04-05 11:31 by
polyrandom
這個問題也可以用顯式初始化解決。
如果你知道你將會在別的cpp里面用到Stack<int>,你可以在stack.cpp里面寫:
template Stack<int>;
template ostream& operator <<(ostream& out,const SegStack<int>& seg);
不過你把operator<<寫成friend可不是很好
#
re: 為什么在VS2005重載輸出運算符那么難?
回復
更多評論
2009-05-23 23:00 by
yyf
如果一定要是類型綁定的,那怎么辦呢?
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
相關文章:
雙鏈表模版類的實現
C風格字符串與標準庫string類型性能對比
算法與數據結構實驗(二)
為什么在VS2005重載輸出運算符那么難?
我的算法與數據結構學習(三)
Josephus問題
算法與數據結構實驗(一)
我的算法與數據結構學習(二)
我的算法與數據結構學習(一)
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © Tauruser
日歷
<
2025年10月
>
日
一
二
三
四
五
六
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
公告
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(7)
給我留言
查看公開留言
查看私人留言
隨筆分類
(16)
MFC(2)
計算機圖形學(2)
密碼學
數學模型
數值計算(2)
算法與數據結構(9)
信息論(1)
隨筆檔案
(34)
2007年3月 (1)
2007年2月 (2)
2007年1月 (1)
2006年10月 (1)
2006年6月 (3)
2006年5月 (5)
2006年4月 (6)
2006年3月 (14)
2006年2月 (1)
文章分類
(5)
密碼學
數學模型
數值計算
算法與數據結構(4)
網絡(1)
信息論
文章檔案
(5)
2006年4月 (1)
2006年3月 (4)
相冊
文章貼圖
收藏夾
(3)
我的收藏(3)
協議
流媒體
中國協議網
友情鏈接
Orlaa
最新隨筆
1.?CListCtrl For Beginners(轉載)
2.?結構體對齊的具體含義(#pragma pack) (轉載)
3.?MFC ComboBox 使用方法(轉載)
4.?05年寫的直線裁剪算法
5.?C# Coding時的注釋格式(zz)
6.?查找字符串的哈希方法(zz)
7.?木馬客戶端與服務端通訊如何隱藏不被發現
8.?Gauss消去法直接求解方程組(附例程)
9.?使用AsycnSocket類進行簡單雙機通訊
10.?Romberg求積(例程)
搜索
積分與排名
積分 - 107246
排名 - 238
最新評論
1.?re: 雙鏈表模版類的實現
問下:關于查找(search)那部分,我有點小問題要問,就是你直接就靠默認的比較操作符來比較,而你所用的是模版,鏈表支持各種類型,那么是字符串類型的鏈表或自定義類型的呢,你該怎么辦
--周曉榮
2.?re: OnSize()加入處理函數后,DEBUG報告出錯
評論內容較長,點擊標題查看
--NULL
3.?re: C風格字符串與標準庫string類型性能對比
評論內容較長,點擊標題查看
--Hzj_jie
4.?re: 05年寫的直線裁剪算法
你這個算法也太復雜了吧
--啊啊啊啊啊啊
5.?re: C++ Primer Fourth Edition (download file)
i want english edition
--zhccc
閱讀排行榜
1.?MFC ComboBox 使用方法(轉載)(18772)
2.?結構體對齊的具體含義(#pragma pack) (轉載)(11493)
3.?Tab Control控件使用的例子(zz)(8386)
4.?MAC地址有合法不合法之分嗎?(7639)
5.?VC++2005 比 VC++ 6.0 退步了?(7576)
評論排行榜
1.?C風格字符串與標準庫string類型性能對比(20)
2.?VC++2005 比 VC++ 6.0 退步了?(12)
3.?OnSize()加入處理函數后,DEBUG報告出錯(8)
4.?為什么在VS2005重載輸出運算符那么難?(7)
5.?Gauss消去法直接求解方程組(附例程)(7)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产精品99久久99久久久二8
|
免费在线亚洲
|
亚洲视频观看
|
亚洲作爱视频
|
亚洲综合国产激情另类一区
|
一区二区三区欧美
|
亚洲伦理在线免费看
|
亚洲人体影院
|
亚洲午夜小视频
|
久久本道综合色狠狠五月
|
欧美一区二视频
|
久久久精品免费视频
|
免费高清在线一区
|
亚洲精品人人
|
欧美在线观看www
|
欧美成人一区在线
|
国产精品久久久久久影视
|
国产裸体写真av一区二区
|
伊人成年综合电影网
|
亚洲图中文字幕
|
猫咪成人在线观看
|
欧美日韩在线播
|
亚洲高清影视
|
久久天天躁夜夜躁狠狠躁2022
|
欧美激情精品久久久久
|
性久久久久久久
|
欧美香蕉大胸在线视频观看
|
一区在线视频
|
久久久午夜精品
|
性欧美激情精品
|
国产精品久在线观看
|
99精品视频免费观看视频
|
美女主播视频一区
|
久久免费视频观看
|
玉米视频成人免费看
|
新片速递亚洲合集欧美合集
|
亚洲国产精品电影在线观看
|
久久看片网站
|
亚洲精品综合
|
亚洲免费成人av电影
|
欧美啪啪成人vr
|
亚洲欧美视频在线观看
|
亚洲一区二区三区四区在线观看
|
欧美日韩视频在线一区二区
|
亚洲乱码视频
|
亚洲综合视频网
|
国产自产女人91一区在线观看
|
久久亚洲高清
|
欧美日韩一区在线
|
久久黄色小说
|
蜜桃av一区
|
午夜激情一区
|
久久久久亚洲综合
|
亚洲一区免费网站
|
黄色免费成人
|
一区二区成人精品
|
亚洲国产视频直播
|
亚洲免费视频一区二区
|
亚洲欧洲一二三
|
久久九九全国免费精品观看
|
在线视频亚洲一区
|
欧美成人激情视频免费观看
|
亚洲国产精品久久久久久女王
|
亚洲欧洲一区二区在线观看
|
国产一区二区三区黄视频
|
欧美大片免费看
|
国产日韩欧美中文
|
日韩一级裸体免费视频
|
亚洲国内精品在线
|
久久午夜精品
|
欧美风情在线
|
亚洲欧洲一区二区三区久久
|
亚洲日产国产精品
|
亚洲免费播放
|
中日韩美女免费视频网址在线观看
|
久久精品91久久久久久再现
|
亚洲三级免费电影
|
欧美人与禽猛交乱配
|
宅男精品视频
|
日韩视频―中文字幕
|
久久亚洲影院
|
日韩视频在线观看一区二区
|
亚洲日韩第九十九页
|
乱人伦精品视频在线观看
|
亚洲电影网站
|
亚洲免费成人av
|
亚洲免费在线
|
亚洲电影免费
|
欧美日韩精品一区二区在线播放
|
99国产精品久久久
|
欧美一区二区三区在线观看视频
|
欧美午夜精品一区
|
欧美亚洲综合另类
|
亚洲精品中文字幕女同
|
亚久久调教视频
|
国产自产在线视频一区
|
老司机久久99久久精品播放免费
|
日韩视频精品在线
|
牛人盗摄一区二区三区视频
|
一区二区三区久久久
|
亚洲电影在线看
|
欧美日本乱大交xxxxx
|
久久99伊人
|
亚洲一区二区三区四区五区午夜
|
久久成人18免费观看
|
在线性视频日韩欧美
|
一区二区三区高清视频在线观看
|
欧美激情第3页
|
久久精品在线
|
亚洲视频大全
|
亚洲电影在线播放
|
欧美v国产在线一区二区三区
|
欧美一区亚洲
|
欧美一区二区福利在线
|
性欧美xxxx视频在线观看
|
欧美一级理论片
|
欧美一区二区在线视频
|
一本色道久久综合亚洲精品按摩
|
亚洲人成7777
|
99国产精品99久久久久久
|
亚洲美女在线视频
|
蜜臀av性久久久久蜜臀aⅴ
|
亚洲欧美国产精品va在线观看
|
亚洲视频精品在线
|
亚洲欧美国产高清
|
久久国产加勒比精品无码
|
欧美片第1页综合
|
欧美婷婷六月丁香综合色
|
国产日韩欧美夫妻视频在线观看
|
国产亚洲一区在线
|
精品动漫一区
|
中文欧美在线视频
|
午夜天堂精品久久久久
|
亚洲福利在线视频
|
亚洲一区影院
|
欧美精品二区
|
亚洲福利视频一区
|
久久久爽爽爽美女图片
|
欧美一区二区黄色
|
欧美视频在线看
|
国产精品视屏
|
性欧美18~19sex高清播放
|
亚洲国产视频直播
|
老司机午夜精品视频
|
国产精品最新自拍
|
亚洲韩日在线
|
久久性色av
|
欧美一区深夜视频
|
国产精品专区第二
|
亚洲毛片av
|
亚洲欧美日韩国产一区二区三区
|
极品少妇一区二区三区
|
亚洲手机视频
|
日韩视频在线永久播放
|
欧美日本一区
|
亚洲天堂成人在线视频
|
日韩一本二本av
|
欧美激情一区二区三区在线
|
激情综合亚洲
|
久久人人看视频
|
久久精品人人做人人爽
|
国产日韩欧美在线视频观看
|
夜夜嗨av色一区二区不卡
|
亚洲精品男同
|
欧美日韩在线视频首页
|
日韩视频精品在线
|
欧美在线高清
|
亚洲日本视频
|
亚洲网站在线观看
|
国产综合久久久久久鬼色
|
欧美激情亚洲视频
|
欧美亚洲成人免费
|
亚洲国产日韩欧美
|
一区精品在线播放
|
亚洲欧美日韩直播
|
久久成人人人人精品欧
|
国产一区二区成人
|
日韩视频国产视频
|
亚洲免费视频一区二区
|
国产精品视频xxx
|
欧美怡红院视频
|
亚洲成色777777女色窝
|
日韩视频中午一区
|
国产日韩精品视频一区二区三区
|
亚洲电影免费观看高清完整版在线
|
久久久久一区二区三区
|
久久国产精品高清
|
国产午夜久久久久
|
欧美大片免费
|
久久精品成人一区二区三区
|
亚洲第一精品在线
|
久久狠狠亚洲综合
|
欧美在线观看视频一区二区三区
|
亚洲欧洲精品一区二区
|
黄色亚洲在线
|
国产日韩在线一区
|
欧美日韩国内
|
欧美激情久久久
|
久久综合激情
|
久久精品在线
|