C_and_CPP 板


LINE

開發平台(Platform): (Ex: VC++, GCC, Linux, ...) g++ 程式碼: -----main.cpp----- #include <iostream> #include <stdlib.h> #include "Complex.h" using namespace std; int main(){ Complex a; a=Polar(5.6, 1.8); Abs(a); return 0; } -----Complex.h----- #include <iostream> #include <cmath> class Complex { public: Complex(const double re = 0, const double im = 0); Complex Polar(const double leng, const double arg); friend Complex Polar(const double leng, const double arg); double Abs(); friend double Abs(const Complex& x); private: double real; double imag; }; //Complex Polar(const double leng, const double arg); 錯誤訊息 'Polar' was not declared in this scope 如果把註解拿掉就能正確執行 但是friend Abs也沒有在class外面定義他的prototype卻能編譯過 請問版上各位高手這是為什麼呢? --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.123.85.57 ※ 編輯: tabinoyume 來自: 122.123.85.57 (04/18 21:42)
1F:推 purpose:真的假的,這個 int set 到底有什麼魔力 04/18 22:00
剛有打錯 更正
2F:推 purpose:函數使用前,必須先做原型宣告,C++ 標準的規定 04/18 22:09
friend那行不算是宣告嗎?
3F:推 purpose:好朋友只是朋友 04/18 22:17
4F:推 LPH66:你只有說他是我的朋友 但他在哪我找不到啊... 04/18 22:28
我發覺剛剛提問的不是很恰當,我重新改過內容了 能麻煩各位在幫忙解惑嗎?
5F:推 purpose:好朋友不能給「類別本身的 method」當 04/18 23:00
6F:→ purpose:而且他的功能就只是朋友,跟原型宣告毫無關係 04/18 23:00
7F:推 shadow0326:我覺得這題跟friend無關,應該只是你在定義Complex.h的 04/18 23:02
8F:→ shadow0326:內容的時候使用到沒有forward declared的Polar 04/18 23:03
9F:→ shadow0326:不過只是猜測啦,畢竟你沒貼出Complex.cpp(假設叫這名) 04/18 23:04
我現在問題是Abs我也沒有事先宣告,但是卻能編譯得過 但是Polar卻不行 兩者只差在名為Abs的member function與friend function參數不一樣 而Polar是完全一樣 -----Complex.cpp----- #include "Complex.h" Complex::Complex(const double re, const double im){ real = re; imag = im; } Complex Complex::Polar(const double leng, const double arg){ real = leng*cos(arg); imag = leng*sin(arg); return *this; } double Complex::Abs(){ return sqrt(real*real+imag*imag); } Complex Polar(const double leng, const double arg){ double real = leng*cos(arg); double imag = leng*sin(arg); return Complex(real,imag); } double Abs(const Complex& x){ return sqrt(x.real*x.real+x.imag*x.imag); }
10F:→ s3748679:嗯~ 原Po再確認一下這錯誤訊息的來源檔案 04/18 23:13
11F:→ s3748679:可能就如樓上說的,編譯錯誤是在Complex.cpp發生的~~~ 04/18 23:13
錯誤是顯示在main裡使用到Polar那行
12F:推 purpose:奇怪的是,我用 VC 照你的程式可以跑,真的可以省略... 04/18 23:30
13F:→ purpose:C++ 真是深奧難明 04/18 23:31
14F:推 EdisonX:妙的是我也跑得過去耶, 原po請附上編譯器和編譯參數. 04/18 23:32
g++ -ggdb -Wall -c main.cpp g++ -ggdb -Wall -c Complex.cpp g++ -ggdb -Wall -o main main.o Complex.o
15F:→ FAITHY:???會不會是因為friend complex()找不到他的外部function 04/18 23:32
16F:→ FAITHY:在這個.h裡面? 04/18 23:33
17F:推 s3748679:囧",原來我剛完全把原Po的意思看反了~ 不好意思 04/18 23:47
18F:→ s3748679:剛用DevC++試了一下,沒辦法仿出和原Po一樣的錯誤說~ 04/18 23:47
19F:→ s3748679:安安靜靜的通過說-.-" 04/18 23:48
20F:推 shadow0326:我用g++的確仿出了一樣的問題 @_@ 不知道標準是否有規 04/18 23:50
21F:→ shadow0326:定friend可不可以當成宣告 04/18 23:51
22F:→ shadow0326:我猜是沒有,然後一些編譯器作成有,然後導致一些未定 04/18 23:52
23F:→ shadow0326:義的bug @_@ 04/18 23:52
24F:→ EdisonX:這問題真妙.. 04/18 23:53
25F:推 purpose:全域函數的原型宣告,出現在 class 裡面,這不是很詭異嗎 04/18 23:57
26F:推 EdisonX:@p大, 是很鬼異, 不過鬼異的是 vc 竟然解析得出來..  04/18 23:59
27F:→ EdisonX:CL.exe main.cpp Complex.cpp /Fe"main.exe" 成功了.. 04/19 00:00
28F:推 s3748679:詭異+1,還是老老實實地在class外面寫原型宣告好了#_#" 04/19 00:01
29F:→ leiyan:在裡面重宣告Complex物件存進去再return呢? (我隨便說的) 04/19 00:02
※ 編輯: tabinoyume 來自: 122.123.85.57 (04/19 00:12)
30F:→ loveme00835:這跟 name lookup 規則有關, Polar() 在 main() 中是 04/19 01:56
31F:→ loveme00835:invisible 的, 除非前面爬到定義/宣告為止, Abs() 之 04/19 01:58
32F:→ loveme00835:所以能叫用的原因是因為參數型別的關係, 使得找尋可匹 04/19 01:58
33F:→ loveme00835:配叫用的函式範圍又多了兩個選項: Complex 所在的命名 04/19 02:00
34F:→ loveme00835:空間以及它本身的spec 04/19 02:01
35F:→ loveme00835:想讓 Abs() 也一樣掛的話, 這樣呼叫即可 (Abs)(a); 04/19 02:04
36F:→ loveme00835:std::getline() 的使用者多多少少也遇過這種情況才是 04/19 02:05
37F:→ Favonia:樓上講的並不完全正確,因為 friend 應該只有引入不可見 04/19 08:12
38F:→ Favonia:的名稱... 一般的 getline 是有乖乖寫下正常定義的,但這 04/19 08:25
39F:→ Favonia:裡只有寫 friend 04/19 08:26
40F:→ paul0904:看似串出作業ww 04/19 10:00
41F:→ shadow0326:原來如此,學到一課了 04/19 10:13
42F:→ Favonia:沒有「原來如此」吧... l大講的ADL這裡根本不適用啊? 04/19 10:45
43F:→ Favonia:www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html 04/19 10:46
44F:→ Favonia:#165 看看標準委員會的答案寫什麼... 04/19 10:46
45F:→ Favonia:至於編譯器要怎麼實作就是另外的問題啦 xD 04/19 10:49
46F:→ Favonia:根本問題是 friend 宣告算不算「宣告」;我只能說兩種觀點 04/19 10:53
47F:→ Favonia:都有人在吵;我認為按照標準精神不管誰都找不到,gcc 目前 04/19 10:56
48F:→ Favonia:讓ADL得逞就是了(因為標準好像只有列舉正常lookup必失敗 04/19 10:58
49F:→ Favonia:(不好意思上面的話沒啥條理,可惜推文不能改 xD) 04/19 12:03
50F:推 lwecloud:樓上可以回一篇文阿XD 04/19 12:15
51F:→ Favonia:唔我剛才發現 L 大才是對的,請把我上面的推文都忽略 orz 04/19 21:45
52F:→ Favonia:造成大家困擾真不好意思 orz 04/19 21:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP