помогите с явной специализацией шаблона - PullRequest
2 голосов
/ 26 июня 2009

спасибо за поиск я получил этот пример из своей книги, но я не могу понять, почему строка

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

но

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

Кто-нибудь может объяснить поведение? Кстати все комментарии в коде ниже от автора книги

большое спасибо!

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 Ответ

3 голосов
/ 26 июня 2009

Почему он должен использовать (2)?

(2) является специализацией S<void, int>. Что у вас есть S<void, char>. Типы разные, поэтому специализация не используется. Специализации применяются, только если они точно соответствуют . Недостаточно того, что «символ может быть неявно повышен до типа int». Если для S<void, char> нет специализации, то будет использоваться общая, неспециализированная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...