開發平台(Platform): (Ex: Win10, Linux, ...)
Ubuntu 20.04
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
g++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
給定一個 template class 全部的 member function definition,有沒有辦法對於某個 sp
ecialized class 來說我只特化它的其中一個 function,而且要用 original definition?
由於我必須複製它原始整份的實作到特化的函式定義裡面,才會編譯成功。想請問各位板大
有沒有不用複製整份程式碼也能只特化其中一個函式的方法?穴穴大家。
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
我現在程式碼有定義一個可以根據 Leaf type 去特化的一個二元樹模板
template <typename Leaf> struct AUTOQ::Util::BinaryTree
.h 檔有放 prototype, .cpp 檔有放 implementation
那我們都知道如果要針對某種 Leaf 例如 int 去特化這棵二元樹,那必須在所有 *.cpp
的末尾加上 template struct AUTOQ::Util::BinaryTree<int>; 這句話才能把所有函式
實作特化出來。
但現在問題是,我的模板有包含一個兩棵二元樹相加的函式,而這個在 Leaf 是 string
的時候是無法支援的,因此我只想實作例如 AUTOQ::Util::BinaryTree<string> print
函式,那現在的狀況就是:
(1) 單純在有實作 print 的 .cpp 底下補上
template <> void AUTOQ::Util::BinaryTree<string>::print();
這句話,此時 main 函式會通報找不到這個實作,而無法編譯成功。
(2) 我在這個有實作 print 的 .cpp 底下補上
template <> void AUTOQ::Util::BinaryTree<string>::print() {
// 複製原本模板裡面的程式碼
}
這個新的實作,main 函式就找得到了。
所以問題就是,如何採用類似 (1) 的手法,使得我不需要再複製一次程式碼,就能直接
使用模板的實作呢?
補充說明(Supplement):