我真的很討厭 C++。 (= 皿 = )凸
by Dboy Liao
只是想寫一篇紀念我為了 C++ 今晚不斷 google 所花的 2 個小時。
情境是這樣的:我想幫一個 template class MyObject
寫 <<
的 operator overloading,中間必須可以 print 出 MyObject
的 private member 。
看到這個題目,或許有些人想說這有什麼難的?譬如說像下面這個例子就可以做到這樣的事:
現在你就可以 std::cout << MyObject<int>(3) << std::endl;
print 出 3 了。
就 friend
它就好了嘛,有什麼難的?
偏偏我就犯賤,想說如果我想把這個 operator overloading 的實作藏在另一個 private header 呢?
也就是說,不能把這些實作寫在同一個 header 檔裡。
仗著自以為了解 C++ template ,我寫出了這個東西:
public.hpp
private.hpp
private.cpp
:
最後是 main.cpp
然後我就可以分開 compile 出 object file (.o 檔) 再 link 就好,我心想我真是太聰明了。
結果 C++ 馬上打臉了我這個白癡:
靠北….說好的 friend
呢???
結果就陷入各種 google,最後終於找到答案:
結果就是必須改成這樣:
修改後的 public.hpp
:
private.hpp
、private.cpp
跟 main.cpp
都不用改。
簡單的來說,就是要透過 forward declaration 去告訴 C++ compiler 說這個 operator 本身也是個 template function ,否則 C++ 會把 friend operator 預設是一個 non-template function 去 compile,所以當然就一副 friend 莫名其妙沒有效果的感覺,其實是因為根本是兩個不同的東西。再來就是在 class 的宣告中,operator 那邊出現了 <<<>
這種鬼東西,只為了告訴 C++ 說這是個 template 喔 😘
為了短短 4 行,晚上的兩個小時蒸發了。
好吧,一個晚上又平安的過去了。去你的 C++ 🖕