Это фрагмент кода, на котором я безнадежно застрял.
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*?
could not convert template argument &d to base*
При сопоставлении аргумента с параметром, который является указателем / ссылкой, производные от базовых преобразований не учитываются, даже если преобразования действительны в других обстоятельствах.
14.3 / 5 [Стандартная цитата только для справки]
Если нетипизированный шаблонный аргумент не может быть преобразован в тип соответствующего шаблонного параметра, то программа некорректна. .... для нетипового шаблона-параметра типа указатель на объект применяются квалификационные преобразования (4.4) и преобразование массива в указатель (4.2).[Примечание: В частности, не применяется ни преобразование нулевого указателя (4.10) , ни преобразование из производного в основание (4.10) .Хотя 0 является допустимым аргументом шаблона для нетипичного шаблона-параметра целочисленного типа, он не является допустимым аргументом шаблона для нетипичного шаблона-параметра типа указателя.]
Если нетипизированный шаблонный аргумент не может быть преобразован в тип соответствующего шаблонного параметра, то программа некорректна.
....
для нетипового шаблона-параметра типа указатель на объект применяются квалификационные преобразования (4.4) и преобразование массива в указатель (4.2).[Примечание: В частности, не применяется ни преобразование нулевого указателя (4.10) , ни преобразование из производного в основание (4.10) .Хотя 0 является допустимым аргументом шаблона для нетипичного шаблона-параметра целочисленного типа, он не является допустимым аргументом шаблона для нетипичного шаблона-параметра типа указателя.]