2009-06-25 89 views
2

謝謝你看我 得到了我的書,這個例子,但我不能明白爲什麼線幫助顯式模板especialization

S<void,int> sv; // uses Template at (2) 

S<void,char> e2; 
//uses (1) when im thinking it would use (2) especialization as well 

任何人都可以解釋的行爲? btw以下代碼中的所有評論均來自書籍作者

非常感謝!

template<typename T> 
class Types { 
    public: 
    typedef int I; 
}; 

template<typename T, typename U = typename Types<T>::I> 
class S;      // (1) 

template<> 
class S<void> {     // (2) 
    public: 
    void f(); 
}; 

template<> class S<char, char> {}; // (3) 

template<> class S<char, 0>; // ERROR: 0 cannot substitute U 

int main() 
{ 
    S<int>*  pi; // OK: uses (1), no definition needed 
    S<int>  e1; // ERROR: uses (1), but no definition available 
    S<void>*  pv; // OK: uses (2) 
    S<void,int> sv; // OK: uses (2), definition available 
    S<void,char> e2; // OK: uses (1), definition available 
    S<char,char> e3; // ERROR: uses (3), but no definition available 
} 

回答

3

爲什麼要用(2)? (2)S<void, int>的專業化。你有什麼是S<void, char>。類型不同,所以不使用專業化。專業化只有在與完全匹配時才適用。 「一個字符可以被隱式提升爲int」並不夠好。如果S<void, char>沒有專門化,那麼它將使用通用的非專用版本。

+0

但對於s 任 我只看到especialization對於s {} 和 小號心不是專業化 SV; 使用小號 pyralis 2009-06-26 00:07:28