2012-06-22 2 views
3

Рассмотрим следующий код:значения по умолчанию параметров шаблона в шаблоне класса специализаций

template <class x1, class x2 = int*> 
struct CoreTemplate { }; 

template <class x1, class x2> 
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } }; 

template <class x> 
struct CoreTemplate<x*> { int spec; CoreTemplate() { spec = 3; } }; 

int main(int argc, char* argv[]) 
{ 
    CoreTemplate<int*, int*> qq1; 
    printf("var=%d.\r\n", qq1.spec); 

    CoreTemplate<int*> qq2; 
    printf("var=%d.\r\n", qq2.spec); 
} 

MSVC компилирует этот код штраф и выбирает вторую специализацию в обоих случаях. Для меня эти специализации идентичны. Насколько законна вторая специализация в первую очередь?

Просто любопытно, любые мысли по этому поводу?

ответ

4

Вторая частичная специализация является законной и не идентична первой.

Вторая частичная специализация не список аргументов для второго параметра шаблона в списке аргументов шаблона, поэтому использует аргумент по умолчанию int*, так что это эквивалентно:

template <class x> 
struct CoreTemplate<x*, int*> { ... }; 

Какой будет выбран для любого экземпляра, где первым аргументом шаблона является тип указателя, а второй аргумент шаблона - int*.

Это более специализировано, чем первая частичная специализация, которая будет использоваться, когда первый аргументом шаблона является типом указателя, а второй аргумент шаблона любого типа указателя кромеint*.

В программе как qq1 и qq2 использование int* в качестве второго аргумента шаблона (либо явно, либо с помощью аргумента по умолчанию), так и выбор второго экземпляра.

+0

Спасибо за комментарий. Разумный совет. –

Смежные вопросы