Здравствуйте, ss_greh, Вы писали:
_>Здравствуйте, Vamp, Вы писали:
_>>>Не могу понять почему. На сколько я знаю в C++ строковый литералы имеют тип const char*.
V>>Нет. const char [].
_>Хорошо. Меня ввела в заблуждение книга Николая Джосаттиса "С++ стандартная библиотека".
_>В ней черным по белому, в главе посвещенной строкам, написано:
_>_>...
_>Учтите, что тип строковых литералов (например, "hello") был заменен на const char*. Тем не менее
_>для обеспечение совместимости поддерживается неявное (хотя и нежелательное) преобразование к char*.
_>...
_>Буду теперь думать, прежде чем верить печатному слову.
Джосьютис не сказал ничего неверного.
Его слова о типе строковых литералов в главе 11 относятся к конструкторам string, которые получают строковые литералы
по значению как const char*. У вас первичный шаблон функции test, (primary template) и его специализации получают
ссылку. Поэтому! проявляется проблема несоответствия между массивом символов и указателем на символы.
Если обьявить первичный шаблон функции test получающим указатель, затем, специализировать его типом const char*, вы получите вызов специализации const char* в строке N3 вашего первого поста, которую вы и ожидали в первом посте.
template<class T>
void test(const T* t) {
}
template<> // в строке N3 вызов будет сюда
void test( const char* t ) {
}