Re[3]: Специализация шаблонной функции
От: Demay  
Дата: 28.05.04 07:13
Оценка:
Здравствуйте, 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 ) {
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.