@Francis Arcanum
有點(diǎn)明白了,如果出現(xiàn)像上述小程序中的4函數(shù),因該一開始編譯器就決定用它。如果沒有的話,再在二個(gè)模板函數(shù)中進(jìn)行判斷,決定使用哪一個(gè)。然后發(fā)現(xiàn)是個(gè)模板函數(shù),要實(shí)例化了,看見一個(gè)很匹配的特化版本,就直接用它了,對嗎? 上課要遲到了,哈哈,謝謝兄弟~。
void f(T) {} // [1]
template < typename T >
void f(T * ) {} // [2]
template <>
void f < int *> ( int * ) {} // [3]
void f(int *)
{
cout<<"111"; //[4]
}
int _tmain(int argc, _TCHAR* argv[])
{
int * p = 0 ;
f(p);
int pause;
cin>>pause;
return 0;
}
我又加了一個(gè)函數(shù),我想問一下,在這個(gè)小程序里,編譯到底有沒有對二個(gè)模板函數(shù)做重決呢?難道編譯器先對二個(gè)模板函數(shù)進(jìn)行重載的決議,然后決定哪個(gè)模板更好一些,然后再在實(shí)例化的時(shí)候,在比較匹配的模板所有可能的實(shí)例化版本和它的特化版本,還有函數(shù)4,中選擇一個(gè)最佳。不好意思,不知道有沒有表達(dá)清楚我的意思。
謝謝您
我還是弄大不懂
你的意思說編譯器看到y(tǒng).g<int>(),查找到那個(gè)模板函數(shù)以后就不繼續(xù)找了,因?yàn)樗撬接械?,就直接?bào)錯(cuò)了(盡管還有一個(gè)公有的特化版本)。那如果不是私有的,那么它就準(zhǔn)備實(shí)例化,當(dāng)實(shí)例化的時(shí)候它還會(huì)去查符號?然后發(fā)現(xiàn)一個(gè)特化的版本,然后又調(diào)用了特化版本的?
是不是在沒有重載的情況下,編譯器找到一個(gè)符合內(nèi)容的就會(huì)符號就會(huì)地址搜索,所以例5中的那個(gè)特化沒有被考慮呢?
對特化不大了解,不知道特化用在什么地方,看起來只要有模板函數(shù),編譯器就無視特化函數(shù),能舉個(gè)編譯器不無視特化函數(shù)的例子嗎?