作者LPH66 (运命のルーレット廻して)
看板C_and_CPP
标题Re: [问题] 使用VC++6, link时出现的error! 已经爬 …
时间Wed Nov 2 20:56:00 2005
※ 引述《FiveAaaa ([5A]aaa  N  I》之铭言:
: 推 FiveAaaa:我检查过了...都没有名称上的错误 11/02 15:45
: 推 LPH66:参数型态和回传形态以及函式大小写都要一样... 11/02 15:52
: 推 FiveAaaa:我也检查了大小写...但是没有不同阿ToT怎麽办 11/02 17:45
: 推 LPH66:那还是贴个code看看好了@@| 11/02 18:39
: 我的code, 有点长= = http://w3.nctu.edu.tw/~u9212037/
: 里面有1些标头档是在
: http://www1.pacific.edu/~wford/fordtopp/cs2book/cs2_index.html 下载的,
: 我是用VC++6.0的那个压缩档
: http://www1.pacific.edu/~wford/fordtopp/cs2book/ftsoftds_VC++6.zip
: 如果各位能播空看看, 小弟将感激不尽!
好多错...orz
===================分隔线===================
1.函式宣告不应该在main里面 要让它出现在外面
所以把那十几行函式宣告搬出main 放在enum下面
但是这麽一来会出现15个error
先来看第一个
xxx.cpp(15) : error C2955: 'vector' : use of class template requires template
argument list
指向刚搬出去的宣告第一行
这是因为vector是有template的 你忘了附上
===================分隔线===================
2.把前面七行宣告中所有的vector加上<T> 前面加上template <class T> 加完再compile
这次又出现link error 仍然是timesort函式的问题
(其实这才是你的问题 但是这问题...嗯...等等你就知道了...)
看看timesort函式的实作 发现有加上template <class T>
於是照加
===================分隔线===================
3.加好再compile一次 这次出现16个error
指向呼叫timesort的16行
这里问题来了 它的错误讯息是:
xxx.cpp(39) : error C2783: 'void __cdecl timesort(enum sortType,enum testType,
int)' : could not deduce template argument for 'T'
它不能决定timesort是用哪一个 T 到底是int/char/long/double/...哪一个都不知道
那要怎麽让compiler知道我们要用哪一个 T 呢?
我想到的做法是传一个变数值进去 值本身没有意义
只是用来指出型态
所以我把函式宣告改成这样:
template <class T>
void timesort(sortType stype, testType tst, int vecSize, T typevar);
然後在所有呼叫的地方加传一个参数0 表示我们要用int
ex: timesort(Selection, Rand, nEx, 0);
当然实作的地方也要改
===================分隔线===================
4.改好了之後compile, 这次还是15个错, 不过指向了timesort内部了
第一个是:
xxx.cpp(84) : error C2065: 'create' : undeclared identifier
咦? 你不是写了create函式了吗? 回头看宣告:
template <class T> vector<T>&
Create(testType t, int n);
O my god....
再来看第二个:
xxx.cpp(84) : error C2065: 'vecSiZe' : undeclared identifier
等等..vecSiZe不是参数吗?
看宣告:
void timesort(sortType stype, testType tst, int vecSi
ze, T typevar)
...........orz
然後一看, 下面的五组全部都打错 orz orz orz
===================分隔线===================
5.费了一番工夫把五个全改回来 再度compile 13个error...
第一个是:
xxx.cpp(84) : error C2783: 'class std::vector<T,class std::allocator<T> >
&__cdecl Create(enum testType,int)' : could not deduce template argument for
'T'
指向 vector<T>&testv=Create(tst, vecSize); 这一行
和上面3.的原因一样 无法决定T
所以照3.的方法修改
只是这次直接把typevar传进去 因为它就是我们要的T
顺便把R,A,D三个函式也改好
===================分隔线===================
6.改好後再度compile 8个error
第一个说:
xxx.cpp(85) : error C2318: no try block associated with this catch handler
仔细看code...同学 你写了catch忘了try啦....
===================分隔线===================
7.把五个try全部补上 再compile
(你在case Insertion:的宣告忘了;结束...)
终於剩下2个error了...
2个分别是:
xxx.cpp(94) : error C2065: 'testv' : undeclared identifier
xxx.cpp(97) : error C2065: 'tshow' : undeclared identifier
嗯? 不是testv已经宣告了吗? 怎麽还说没有?
其实是因为你把宣告摆在try{}的大括号里的关系...
在任何{}大括号中宣告的变数 一旦离开了{} 就会变成未宣告
所以要做的第一件事是把testv的宣告拉出来
第二个错: tshow是啥东东? 似乎是要呼叫show的样子?
所以把tshow改成show
===================分隔线===================
8.再度compile 1个error
xxx.cpp(80) : error C2530: 'testv' : references must be initialized
这是在说reference一宣告就要初始化
不过看看你的五个初始化 呼叫的都是Create 参数都一样
那我们可以把五个初始化统一 在函式开始就宣告好
然後把整个switch塞进一个try里 最後用一个catch来接错误
(要这麽做是为了避免7.的问题)
===================分隔线===================
9.再度compile 3个error
不过已经出了timesort的范围了 可喜可贺XD
error都是一样的:
xxx.cpp(210) : error C2065: 'createR' : undeclared identifier
xxx.cpp(212) : error C2065: 'createA' : undeclared identifier
xxx.cpp(214) : error C2065: 'createD' : undeclared identifier
回头看宣告....同学 你又把C的大小写打错了~"~
===================分隔线===================
10.改好後再次compile....怎麽又是3个error?!
错误讯息告诉你CreateR吃两个参数..所以是我们在5.时加的typevar忘了传过去
所以和5.一样依样画葫芦 把typevar往下传
===================分隔线===================
11.compile...9个error<囧>
第一个告诉你全域函式没有this....
同学 这里不是vector物件 这里是全域函式啊<囧>
你得宣告一个vector出来 回传其参考啊...
所以得要像这样改:
template<typename T>
vector<T>& CreateR(int n, T typevar)
{
static vector<T> v;
int i;
for(i=0;i<n;i++)
v.push_back(rnd.random(1000000));
return
v;
}
宣告加static是防止它出了{}就被摧毁
===================分隔线===================
12.再次compile...2个link error
xxx.obj : error LNK2001: unresolved external symbol "void __cdecl shellSort(
xxx.obj : error LNK2001: unresolved external symbol "void __cdecl exchangeSort(
<error message 後略>
看出什麽不对了没? 你又打错大小写了啦<囧>
===================分隔线===================
13.把实作里的两个sort改成Sort 再次build...
5 error 2 warning orz orz orz orz orz orz orz
第一个错误指在shellSort的宣告区:
vector<T>& t1v,t2v,finalv=v;
xxx.cpp(184) : error C2530: 't1v' : references must be initialized
和8.一样的错误讯息....
这告诉你 reference必须打一开始就必须初始化
这种情况倒不如用个指标去指它
所以把这个函式里用到的reference全部改成指标
template<typename T>
void shellSort(vector<T>& v)
{
int g=v.size();
int h,i,j,k;
vector<T> *t1v,*t2v,*finalv=&v;
for(k=1;k<=n/9;k=3*k+1)
{
//怎麽这里有个空回圈? 记得把它填起来啊
}
for(h=k;h>0;h--)
{
t2v=finalv;
for(i=0;i<
finalv->size();i++)
finalv->pop_back(); //嗯?是不是忘了()?我帮你补上了
for(i=0;i<h;i++)
{
for(j=0;j<
t1v->size();j++)
t1v->pop_back(); //,这里也忘了()
for(j=i,j<g;j+=h)
t1v->push_back((*t2v)[j]);
insertionsort(*t1v);
join(*finalv,*t1v);
}
}
v=*finalv;
}
然後第二个error message:
xxx.cpp(185) : error C2065: 'n' : undeclared identifier
这个更有趣XDrz n是长度吧? 那不是已经放在g了? 所以把n改成g
===================分隔线===================
14.改完再度compile: 3 errors
第一个
xxx.cpp(197) : error C2143: syntax error : missing ';' before ')'
指向一个for
仔细看: 同学 你把第一个;打成,了 @_@
剩下的两个:
xxx.cpp(199) : error C2065: 'insertionsort' : undeclared identifier
xxx.cpp(200) : error C2065: 'join' : undeclared identifier
第二个...你是想呼叫函式库里的insertion
Sort吧 @_@;
第三个...你想把两个vector接起来? 可是并没有join这个函式啊...
就算用(*finalv).join(*t1v);也不对 因为vector没有提供join这个函式
这个最後的问题就要你自己想办法了...
(这我真的帮不到 囧兴~)
--
好累..囧
一个错拉出一大票错出来....
(而且你果然打错了不少大小写....@@|)
--
"LPH" is for "Let Program Heal us"....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.240.54
1F:推 aecho:@@ 你真是好人~~ 给你加加油~~ 11/02 21:01
2F:推 tititata:虽然我是路人甲....不过还是要说:辛苦了 11/02 21:07
3F:推 FiveAaaa:我...我好想请你吃王品...泪 11/02 21:45
4F:推 godfat:囧...有点想说同学是不是太无聊了,来帮我写作业好了... 11/02 22:00
5F:推 pcjustin:Orz,真是debug神人,我还没debug过那麽多错 11/03 00:30
6F:推 embedded:台大来的就是不一样呀.....威呀 11/03 18:59
7F:推 asontsao:112果然是我们113的强劲对手阿. 11/06 21:22