开发平台(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):