青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
Tauruser
Enjoy Every Day
posts - 34, comments - 95, trackbacks - 0, articles - 5
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
為什么在VS2005重載輸出運算符那么難?
Posted on 2006-03-14 23:48
Tauruser
閱讀(1713)
評論(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
日歷
<
2006年3月
>
日
一
二
三
四
五
六
26
27
28
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求積(例程)
搜索
積分與排名
積分 - 107450
排名 - 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 使用方法(轉載)(18781)
2.?結構體對齊的具體含義(#pragma pack) (轉載)(11499)
3.?Tab Control控件使用的例子(zz)(8389)
4.?MAC地址有合法不合法之分嗎?(7646)
5.?VC++2005 比 VC++ 6.0 退步了?(7583)
評論排行榜
1.?C風格字符串與標準庫string類型性能對比(20)
2.?VC++2005 比 VC++ 6.0 退步了?(12)
3.?OnSize()加入處理函數后,DEBUG報告出錯(8)
4.?為什么在VS2005重載輸出運算符那么難?(7)
5.?Gauss消去法直接求解方程組(附例程)(7)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产在线拍偷自揄拍精品
|
欧美伊人影院
|
欧美成人tv
|
亚洲国产三级
|
欧美激情欧美狂野欧美精品
|
久久久久久久成人
|
亚洲国产一区二区a毛片
|
美女日韩在线中文字幕
|
久久在线播放
|
日韩视频免费
|
亚洲一区二区三区视频
|
国产精品一区久久久
|
久久精品亚洲乱码伦伦中文
|
夜夜嗨av色综合久久久综合网
|
欧美高清视频在线
|
欧美日韩精品在线视频
|
亚洲一区欧美
|
久久国产精品亚洲va麻豆
|
亚洲电影观看
|
在线天堂一区av电影
|
国产欧美一区二区三区视频
|
狂野欧美一区
|
欧美激情久久久久
|
欧美一级免费视频
|
免费在线欧美黄色
|
亚洲欧美日韩国产中文在线
|
久久精品视频在线观看
|
一本色道久久综合狠狠躁篇的优点
|
欧美一区二区三区喷汁尤物
|
欧美综合第一页
|
夜夜精品视频一区二区
|
一区二区三区成人
|
在线电影欧美日韩一区二区私密
|
亚洲三级电影全部在线观看高清
|
国产精品毛片大码女人
|
欧美aⅴ99久久黑人专区
|
欧美午夜在线视频
|
欧美jjzz
|
国产性做久久久久久
|
亚洲精品午夜
|
在线看成人片
|
午夜精品久久久久久久99热浪潮
|
激情成人中文字幕
|
一本久道久久综合中文字幕
|
在线播放一区
|
亚洲欧美日韩国产
|
一区二区三区毛片
|
麻豆国产精品一区二区三区
|
性色一区二区三区
|
欧美日韩一区二区在线视频
|
免费欧美在线视频
|
国产亚洲欧美一区
|
亚洲无线观看
|
亚洲一区国产一区
|
欧美日韩国产区一
|
亚洲第一在线综合在线
|
精品成人久久
|
久久国产手机看片
|
久久精品夜色噜噜亚洲a∨
|
久久中文字幕一区二区三区
|
欧美诱惑福利视频
|
国产精品视频一二三
|
亚洲精选在线观看
|
日韩网站免费观看
|
欧美成人精品h版在线观看
|
久久在线视频
|
激情欧美一区二区
|
欧美一区二区在线
|
久久精品国产亚洲一区二区
|
国产精品久久一区主播
|
一区二区三区久久精品
|
亚洲一区二区视频在线观看
|
欧美日韩国产一中文字不卡
|
亚洲精品乱码久久久久久蜜桃麻豆
|
亚洲国产天堂久久国产91
|
玖玖综合伊人
|
亚洲国产日韩在线
|
亚洲六月丁香色婷婷综合久久
|
免费欧美网站
|
亚洲每日更新
|
亚洲欧美在线一区
|
国产日韩欧美制服另类
|
久久精品91
|
欧美91视频
|
日韩午夜av电影
|
欧美日韩中文字幕在线
|
中文久久精品
|
久久久一二三
|
日韩视频永久免费
|
国产精品chinese
|
亚洲免费一级电影
|
欧美 亚欧 日韩视频在线
|
亚洲日本无吗高清不卡
|
欧美视频三区在线播放
|
欧美一区二区黄色
|
亚洲国产成人在线
|
午夜精品久久久久影视
|
在线播放一区
|
欧美色欧美亚洲另类二区
|
欧美一区二区三区免费看
|
欧美高清在线
|
午夜久久福利
|
亚洲激情网址
|
国产精品亚洲欧美
|
久久综合图片
|
中文精品在线
|
欧美激情在线
|
久久精品国产综合
|
日韩一级精品
|
黄色成人在线网站
|
国产精品啊v在线
|
免费观看日韩
|
欧美一区视频在线
|
亚洲毛片在线免费观看
|
久久综合九色
|
亚洲欧美日本国产有色
|
亚洲激情视频在线观看
|
国产伦理一区
|
欧美日韩综合视频网址
|
久久综合色影院
|
亚洲欧美日韩国产成人精品影院
|
亚洲高清色综合
|
久久一区国产
|
久久av二区
|
亚洲综合成人在线
|
亚洲日本免费
|
亚洲高清在线精品
|
狠狠色狠狠色综合日日91app
|
欧美日韩亚洲网
|
欧美金8天国
|
免费成人网www
|
久久久综合视频
|
香蕉精品999视频一区二区
|
宅男噜噜噜66国产日韩在线观看
|
亚洲高清自拍
|
亚洲成色www久久网站
|
久久影院午夜论
|
久久成人av少妇免费
|
午夜精品久久
|
亚洲免费一在线
|
亚洲永久免费av
|
亚洲欧美99
|
亚洲欧美日韩在线
|
亚洲欧美综合网
|
亚洲欧美日韩久久精品
|
亚洲欧美日韩在线高清直播
|
亚洲永久免费
|
午夜精品福利在线
|
欧美一区二区三区在线
|
午夜精品久久久久久久
|
午夜精品999
|
久久久999国产
|
久久综合久久综合久久
|
麻豆精品国产91久久久久久
|
免费看黄裸体一级大秀欧美
|
欧美大片一区二区三区
|
欧美国产日韩一二三区
|
亚洲国产欧美一区二区三区久久
|
欧美资源在线观看
|
久久久在线视频
|
久久综合影音
|
欧美韩日精品
|
亚洲欧洲一区二区在线观看
|
日韩写真视频在线观看
|
亚洲专区一二三
|
欧美在线免费观看
|
老司机免费视频久久
|
欧美国产先锋
|
国产精品成人观看视频免费
|
国产伦精品免费视频
|
国产综合视频
|
亚洲精品在线免费观看视频
|
在线视频亚洲欧美
|
久久电影一区
|
亚洲高清在线观看
|
亚洲社区在线观看
|
久久久精品动漫
|
欧美精品亚洲
|
国产视频精品免费播放
|
亚洲国产视频a
|
亚洲欧美亚洲
|
免费久久久一本精品久久区
|
亚洲精品国产精品乱码不99
|
亚洲综合日韩
|
欧美a级片网
|
国产欧美日韩三级
|
日韩一级裸体免费视频
|
久久丁香综合五月国产三级网站
|
欧美大香线蕉线伊人久久国产精品
|
亚洲免费观看
|
久久在线播放
|
国产女主播一区二区
|
99精品99
|
久热精品视频在线观看一区
|
99热这里只有精品8
|
久久亚洲欧美国产精品乐播
|
国产精品羞羞答答xxdd
|
亚洲精品专区
|
玖玖玖国产精品
|
亚洲综合日韩
|