青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
Tauruser
Enjoy Every Day
posts - 34, comments - 95, trackbacks - 0, articles - 5
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
為什么在VS2005重載輸出運算符那么難?
Posted on 2006-03-14 23:48
Tauruser
閱讀(1711)
評論(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求積(例程)
搜索
積分與排名
積分 - 107322
排名 - 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 使用方法(轉載)(18776)
2.?結構體對齊的具體含義(#pragma pack) (轉載)(11495)
3.?Tab Control控件使用的例子(zz)(8387)
4.?MAC地址有合法不合法之分嗎?(7642)
5.?VC++2005 比 VC++ 6.0 退步了?(7579)
評論排行榜
1.?C風格字符串與標準庫string類型性能對比(20)
2.?VC++2005 比 VC++ 6.0 退步了?(12)
3.?OnSize()加入處理函數后,DEBUG報告出錯(8)
4.?為什么在VS2005重載輸出運算符那么難?(7)
5.?Gauss消去法直接求解方程組(附例程)(7)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
午夜精品一区二区三区在线视
|
亚洲人午夜精品
|
久久久国产亚洲精品
|
久久蜜桃资源一区二区老牛
|
国产亚洲亚洲
|
美女精品国产
|
日韩午夜电影在线观看
|
欧美在线观看你懂的
|
伊人久久大香线
|
欧美日韩午夜在线
|
久久久久国色av免费观看性色
|
欧美成人中文字幕在线
|
一本色道久久综合
|
国语精品中文字幕
|
欧美日韩一区二区免费视频
|
欧美一级黄色网
|
亚洲欧洲一区二区三区久久
|
欧美一区=区
|
日韩午夜精品视频
|
黄色资源网久久资源365
|
欧美日本国产在线
|
久久久久成人精品免费播放动漫
|
亚洲国产网站
|
久久久97精品
|
亚洲女同在线
|
日韩午夜免费视频
|
1024精品一区二区三区
|
国产精品久久二区
|
欧美激情第三页
|
久久免费的精品国产v∧
|
亚洲永久免费
|
在线亚洲观看
|
99精品国产在热久久婷婷
|
欧美二区在线看
|
免费不卡视频
|
久久久久久精
|
欧美亚洲一级
|
国产精品99久久久久久有的能看
|
在线看片日韩
|
韩日欧美一区二区
|
国产偷自视频区视频一区二区
|
欧美成人dvd在线视频
|
久久久久99精品国产片
|
性欧美1819sex性高清
|
午夜精品成人在线
|
久久精品国语
|
亚洲国产精品久久久
|
性欧美大战久久久久久久免费观看
|
亚洲精品亚洲人成人网
|
亚洲国产精品123
|
在线看欧美日韩
|
一区视频在线
|
欧美激情一二三区
|
久久精品国产一区二区三区免费看
|
亚洲综合成人在线
|
亚洲黄一区二区三区
|
亚洲成人在线视频播放
|
欧美成人在线影院
|
午夜久久久久久
|
亚洲一区久久
|
亚洲国产综合91精品麻豆
|
好吊视频一区二区三区四区
|
黄色成人在线免费
|
国内伊人久久久久久网站视频
|
国产欧美一区二区三区在线看蜜臀
|
在线精品视频免费观看
|
久久久亚洲欧洲日产国码αv
|
亚洲精品一区在线观看
|
欧美福利网址
|
美女视频一区免费观看
|
韩国久久久久
|
国产综合网站
|
欧美日韩国产综合视频在线观看中文
|
亚洲三级毛片
|
亚洲电影在线
|
91久久精品国产
|
亚洲激情影视
|
在线中文字幕一区
|
亚洲男人av电影
|
久久久精品国产一区二区三区
|
久久深夜福利免费观看
|
久久久久久久高潮
|
欧美大片网址
|
亚洲区欧美区
|
亚洲福利在线看
|
亚洲精品国产视频
|
午夜精品短视频
|
久久久美女艺术照精彩视频福利播放
|
久久国产精品一区二区三区四区
|
乱中年女人伦av一区二区
|
一区二区三区你懂的
|
久久亚洲精品伦理
|
亚洲一二三区视频在线观看
|
国产一区二区三区直播精品电影
|
美女诱惑黄网站一区
|
9国产精品视频
|
免费观看成人www动漫视频
|
亚洲日本激情
|
亚洲激情小视频
|
日韩视频一区二区
|
欧美一级艳片视频免费观看
|
禁久久精品乱码
|
亚洲欧美日韩精品久久
|
亚洲自拍啪啪
|
亚洲国产经典视频
|
亚洲一级高清
|
欧美人与禽猛交乱配
|
亚洲国产综合91精品麻豆
|
欧美先锋影音
|
亚洲精品乱码
|
欧美一区二区大片
|
亚洲片国产一区一级在线观看
|
欧美在线日韩在线
|
欧美视频福利
|
欧美在线欧美在线
|
日韩一二在线观看
|
国产精品一二三视频
|
亚洲激情国产
|
久久偷看各类wc女厕嘘嘘偷窃
|
99精品视频一区
|
欧美日韩成人
|
99天天综合性
|
久久久久成人网
|
国产日韩欧美麻豆
|
一区二区三区精品国产
|
亚洲国产成人av在线
|
久久久蜜桃精品
|
国产欧美精品一区二区色综合
|
亚洲福利电影
|
久久深夜福利
|
一区三区视频
|
亚洲第一网站
|
欧美制服丝袜
|
一区在线观看视频
|
久久久亚洲欧洲日产国码αv
|
亚洲女人天堂av
|
国产亚洲欧洲
|
久久久久久久综合狠狠综合
|
亚洲永久字幕
|
好吊妞**欧美
|
亚洲国产欧美日韩精品
|
亚洲图片你懂的
|
国产一区二区三区自拍
|
午夜精品视频网站
|
亚洲综合色丁香婷婷六月图片
|
国产精品久久亚洲7777
|
欧美一区国产二区
|
久久精品国产69国产精品亚洲
|
国产精品中文字幕在线观看
|
先锋影音网一区二区
|
西西裸体人体做爰大胆久久久
|
欧美午夜宅男影院
|
久久久久久久网站
|
欧美激情在线播放
|
午夜精品久久久久久久99樱桃
|
性久久久久久久久久久久
|
**性色生活片久久毛片
|
亚洲精品乱码久久久久久久久
|
欧美日韩美女
|
久久精品亚洲
|
欧美日韩ab
|
久久精品99
|
欧美久久一区
|
久久夜色精品国产
|
欧美了一区在线观看
|
欧美在线免费
|
欧美高清免费
|
欧美一区二区三区久久精品
|
免费一级欧美片在线播放
|
亚洲欧美日韩另类
|
女仆av观看一区
|
久久精品亚洲
|
国产精品久久久久久亚洲调教
|
久久人人爽人人
|
国产精品麻豆成人av电影艾秋
|
久久一区二区三区国产精品
|
欧美网站在线
|
亚洲电影成人
|
狠狠久久综合婷婷不卡
|
一区二区三区日韩在线观看
|
在线成人激情视频
|
亚洲淫片在线视频
|
在线一区视频
|
欧美大片一区
|
久久蜜桃香蕉精品一区二区三区
|
欧美日韩在线不卡一区
|
亚洲国产成人porn
|
在线播放国产一区中文字幕剧情欧美
|
日韩亚洲欧美成人
|
亚洲狼人综合
|
女同性一区二区三区人了人一
|
欧美中文在线免费
|
国产精品久久久久三级
|
亚洲精品乱码久久久久
|
亚洲国产视频一区二区
|
久久激情婷婷
|
久久精品视频在线观看
|
国产农村妇女毛片精品久久麻豆
|
亚洲欧美一区二区三区极速播放
|
欧美特黄一级
|