青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
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
日歷
<
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求積(例程)
搜索
積分與排名
積分 - 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)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
亚洲午夜一级
|
久久aⅴ国产紧身牛仔裤
|
欧美性视频网站
|
欧美jizzhd精品欧美喷水
|
浪潮色综合久久天堂
|
噜噜爱69成人精品
|
欧美激情一区三区
|
欧美午夜不卡在线观看免费
|
亚洲一级影院
|
亚洲一区日韩
|
欧美在线视频二区
|
久热成人在线视频
|
欧美日本免费一区二区三区
|
欧美四级在线观看
|
狠狠久久亚洲欧美
|
99精品视频免费观看
|
久久综合国产精品
|
午夜精品久久久久久久久久久久久
|
欧美精品www
|
亚洲影视在线播放
|
午夜视频在线观看一区
|
国产一区二区三区在线观看免费
|
日韩亚洲欧美中文三级
|
国产偷久久久精品专区
|
亚洲美女黄网
|
乱码第一页成人
|
欧美高清视频一区
|
欧美bbbxxxxx
|
国产精品99久久久久久www
|
影视先锋久久
|
先锋影音网一区二区
|
亚洲第一精品在线
|
久久五月激情
|
亚洲视频二区
|
久久精品一区二区三区四区
|
国产欧美精品日韩精品
|
欧美专区日韩视频
|
免费视频一区
|
欧美巨乳波霸
|
欧美国产高潮xxxx1819
|
蜜臀av一级做a爰片久久
|
亚洲午夜激情在线
|
一区二区欧美在线
|
一区国产精品
|
久久亚洲综合网
|
韩日欧美一区二区
|
亚洲小视频在线
|
久久久91精品国产一区二区精品
|
亚洲国产你懂的
|
亚洲国产精品一区二区第一页
|
欧美日韩久久
|
亚洲精品少妇30p
|
亚洲区一区二
|
免费观看久久久4p
|
亚洲精品视频在线看
|
亚洲精品一区中文
|
99视频精品在线
|
欧美刺激性大交免费视频
|
香蕉成人久久
|
免费亚洲电影
|
久久午夜影视
|
久久成人18免费网站
|
亚洲国产精品成人
|
欧美在线日韩
|
久久久青草青青国产亚洲免观
|
久久婷婷麻豆
|
中文精品一区二区三区
|
午夜视频在线观看一区二区三区
|
一区二区三区蜜桃网
|
美女日韩欧美
|
亚洲一区免费视频
|
久久er精品视频
|
性欧美18~19sex高清播放
|
亚洲天堂激情
|
久久超碰97人人做人人爱
|
亚洲一区日韩
|
国产伦精品一区二区三区四区免费
|
欧美日韩一区二区在线观看视频
|
欧美日韩www
|
久久综合久色欧美综合狠狠
|
一区二区高清视频在线观看
|
欧美激情精品久久久久久黑人
|
欧美激情精品久久久久
|
在线视频欧美一区
|
国产精品久久久对白
|
国产综合在线视频
|
香蕉尹人综合在线观看
|
亚洲性人人天天夜夜摸
|
欧美美女日韩
|
欧美电影免费观看大全
|
久久综合久久综合久久综合
|
国产精品麻豆成人av电影艾秋
|
久久夜色精品国产亚洲aⅴ
|
国产日韩一区二区三区
|
久久精品国产亚洲5555
|
久久综合网色—综合色88
|
国产日韩av高清
|
欧美一区二区三区在线视频
|
91久久久国产精品
|
久久都是精品
|
欧美韩日一区二区三区
|
久久综合亚州
|
日韩一级黄色av
|
亚洲最新在线
|
久久国产精品一区二区三区
|
久久国产欧美日韩精品
|
国产日韩精品一区
|
欧美在线视频全部完
|
在线亚洲伦理
|
狠狠色狠狠色综合日日五
|
欧美主播一区二区三区
|
午夜精品国产更新
|
一区免费视频
|
亚洲日本电影在线
|
女同一区二区
|
亚洲精品视频在线看
|
一本色道88久久加勒比精品
|
欧美激情视频一区二区三区在线播放
|
亚洲少妇自拍
|
久久精品99久久香蕉国产色戒
|
国内精品视频久久
|
国产精品99久久久久久久久久久久
|
国产亚洲免费的视频看
|
久久国产天堂福利天堂
|
欧美激情一区三区
|
欧美中文字幕视频
|
亚洲欧美日韩专区
|
国产一区二区久久
|
久久久精品欧美丰满
|
久久精品国产亚洲高清剧情介绍
|
欧美四级在线
|
国产精品99久久99久久久二8
|
亚洲一区二区三区精品动漫
|
国产欧美精品一区二区色综合
|
亚洲精品一区中文
|
国产综合亚洲精品一区二
|
欧美一区二区三区男人的天堂
|
亚洲综合色在线
|
蜜臀va亚洲va欧美va天堂
|
欧美专区福利在线
|
国产精品女人久久久久久
|
亚洲精品一区久久久久久
|
亚洲国产欧美一区
|
久久综合999
|
亚洲日本欧美天堂
|
在线观看不卡
|
国产精品99免费看
|
久热精品视频在线
|
亚洲国产欧美一区二区三区同亚洲
|
久久阴道视频
|
中日韩男男gay无套
|
浪潮色综合久久天堂
|
亚洲小说春色综合另类电影
|
欧美一区二区在线播放
|
黄色成人av在线
|
国产日韩一级二级三级
|
亚洲国产精品久久久久秋霞蜜臀
|
国产精品最新自拍
|
亚洲香蕉伊综合在人在线视看
|
亚洲激情视频
|
亚洲青色在线
|
欧美黑人一区二区三区
|
欧美亚州在线观看
|
午夜在线观看欧美
|
先锋影音久久久
|
欧美不卡高清
|
日韩亚洲国产精品
|
国产精品入口日韩视频大尺度
|
欧美亚洲在线观看
|
91久久精品网
|
久久精品成人
|
亚洲精品一区二区三区四区高清
|
欧美日韩网站
|
久久精品在线视频
|
亚洲精品综合
|
久久久久久91香蕉国产
|
亚洲精品乱码久久久久久久久
|
欧美天天影院
|
久久米奇亚洲
|
亚洲午夜av在线
|
欧美激情网友自拍
|
香蕉久久夜色
|
亚洲人成绝费网站色www
|
国产精品夜夜嗨
|
欧美大秀在线观看
|
久久精品91
|
亚洲一区二区三区四区中文
|
欧美激情一区二区久久久
|
欧美在线一二三四区
|
亚洲高清久久
|
国内外成人免费激情在线视频
|
欧美精品在线观看91
|
久久―日本道色综合久久
|
亚洲先锋成人
|
洋洋av久久久久久久一区
|
欧美激情视频在线播放
|
美女视频黄免费的久久
|
久久激情五月激情
|
亚洲综合精品一区二区
|
亚洲精品日韩欧美
|