2015-03-14 3 views
0
class Copier{ }; 

template<class T> 
class Destructor{ }; 

template<template<class T> class Abstractor> 
class BuildFactory : public Abstractor<Copier>{ }; 

BuildFactory<Destructor> bd; 

Я не могу понять, что будет выведен шаблонный параметр T. Я подозреваю, что T будет выведено Copier, но это как раз то, как я думаю, я не могу это объяснить. Может быть, кто-то может дать объяснение этой теме.Вывод аргумента шаблона, непонятный случай

+1

@RSahu Нет, это не так ... –

+0

@RSahu Почему вы так думаете? Я только сделал предположение об этом. – stella

+0

@LightnessRacesinOrbit Итак, каков правильный путь? – stella

ответ

2

Нет вычеты. Давайте посмотрим на два места, где T существует:

template<template<class T> class Abstractor> 
class BuildFactory : public Abstractor<Copier>{ }; 

Это говорит о том, что BuildFactory шаблон класса, который сам принимает шаблон класса, назвав его Abstractor. Опять же, чтобы быть ясным: Abstractor - это класс шаблон, а не экземпляр. Так что никаких вычетов вообще не происходит. Класс Abstractor<Copier> имеет явный аргумент, так как вы называете Copier.

T на самом деле необязательно; вы могли бы написать:

template<template<class> class Abstractor> 
class BuildFactory : public Abstractor<Copier>{ }; 

Теперь для другого кода:

template<class T> 
class Destructor{ }; 

BuildFactory<Destructor> bd; 

Опять же, вы передаете шаблон Destructor, а не какой-то класс Destructor<T>. Никакой дедукции не требуется.

Кроме того, невозможно вывести аргументы шаблона для шаблонов классов, так или иначе. : P

+0

Да, теперь это ясно. Понимаю, я так понимаю. – stella

+0

@stella: Добро пожаловать :) –

+1

Нет, 'Abstractor ' явно не инстанцируется. Он неявно создается в первой точке использования. Не путайте явную спецификацию параметра шаблона с явным инстанцированием. –

6

T не выводится ни на что. Это даже не нужно. Этот код будет эквивалентен:

template<template<class> class Abstractor> 
class BuildFactory : public Abstractor<Copier>{ }; 

Это просто означает, что Abstractor шаблон класса, и то, что известно как параметр шаблон шаблона.

Обычно необязательный шаблон «параметр» используется для документирования каких-либо шаблонов классов, которые следует использовать.

+0

Да, ключ заключается в том, что шаблон передается, а не класс. –

+0

Ну, на 'BuildFactory bd;' Созданный шаблон BuildFactory является неявным, создающим экземпляр шаблона Destructor. Как шаблон может быть неявным, не вытесняя его, не вызывая его параметр шаблона? – stella

+0

@stella: _ ", из-за чего шаблон Destructor тоже неявный, созданный экземпляр" _ Не верно. –

2

Как уже говорилось в предыдущих ответах, здесь нет вычета. В частности,

  • Abstractor явно указано как Destructor.
  • В BuildFactory, Abstractor явно используется с параметром шаблона Copier.
  • В BuildFactory<Destructor>, так как - Destructor, который явно использует Destructor<T = Copier>.

Поскольку указаны все аргументы шаблона, нет никаких вычетов и даже не использование типов параметров по умолчанию.

+0

Ну, а что, если мы удалим спецификацию базового класса? 'Abstractor' все равно будет 'Destructor' – stella

+0

Как насчет этого случая? http://pastebin.com/XifMLyBA – stella

+0

@stella: Использование 'Destructor ' не исключает ** также ** с помощью 'Destructor '. В вашем новом примере 'A' явно используется с аргументом' C', а 'A' ​​также явно используется с аргументом' E'. 'B ' делает 'A = D', явно, поэтому вы используете' D 'и' D ', но все параметры по-прежнему явно указаны, нет дедукции и не выполняется дефолт. –

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