帮助显式模板专业化

时间:2009-06-25 23:53:13

标签: c++ templates

谢谢你的期待 我从我的书中得到了这个例子,但我不明白为什么这行

  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 
} 

1 个答案:

答案 0 :(得分:3)

为什么要使用(2)

(2)是S<void, int>的专业化。你拥有的是S<void, char>。类型不同,因此不使用专业化。专业化仅在与完全匹配时才适用。 “将char隐式提升为int”并不够好。如果S<void, char>没有专门化,那么它将使用通用的非专用版本。