Тип производного класса в аргументе шаблона не компилируется - PullRequest
5 голосов
/ 27 апреля 2011

Это фрагмент кода, на котором я безнадежно застрял.

template <class T, T nt>
class C;

struct base{
   int i;
} b;

struct derived : base{} d;

C<base*,&d> obj;

Почему это дает ошибку could not convert template argument &d to base*?

1 Ответ

5 голосов
/ 27 апреля 2011

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

14.3 / 5 [Стандартная цитата только для справки]

Если нетипизированный шаблонный аргумент не может быть преобразован в тип соответствующего шаблонного параметра, то программа некорректна.

....

для нетипового шаблона-параметра типа указатель на объект применяются квалификационные преобразования (4.4) и преобразование массива в указатель (4.2).[Примечание: В частности, не применяется ни преобразование нулевого указателя (4.10) , ни преобразование из производного в основание (4.10) .Хотя 0 является допустимым аргументом шаблона для нетипичного шаблона-параметра целочисленного типа, он не является допустимым аргументом шаблона для нетипичного шаблона-параметра типа указателя.]

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