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