Operator Overloading for Class Template in C++

Dboy Liao
4 min readAug 3, 2021

--

我真的很討厭 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:

哼哼,我知道要逼 compiler generate symbol

最後是 main.cpp

然後我就可以分開 compile 出 object file (.o 檔) 再 link 就好,我心想我真是太聰明了。

結果 C++ 馬上打臉了我這個白癡:

靠北….說好的 friend 呢???

結果就陷入各種 google,最後終於找到答案:

結果就是必須改成這樣:

修改後的 public.hpp :

可以對照一下看看我加了啥

private.hppprivate.cppmain.cpp 都不用改。

簡單的來說,就是要透過 forward declaration 去告訴 C++ compiler 說這個 operator 本身也是個 template function ,否則 C++ 會把 friend operator 預設是一個 non-template function 去 compile,所以當然就一副 friend 莫名其妙沒有效果的感覺,其實是因為根本是兩個不同的東西。再來就是在 class 的宣告中,operator 那邊出現了 <<<> 這種鬼東西,只為了告訴 C++ 說這是個 template 喔 😘

為了短短 4 行,晚上的兩個小時蒸發了。

好吧,一個晚上又平安的過去了。去你的 C++ 🖕

--

--

Dboy Liao

Code Writer, Math Enthusiast and Data Scientist, yet.