template <typename _Ty>
class A
{
public:
A(){}
~A(){}
private:
static bool Equals(const _Ty &a, const _Ty &b) { return a == b;}
};
//специализируем для char*
template<>
bool A<char*>::Equals(const char* &a, const char* &b){
return !strcmp(a, b);
}
Но получим такую ошибку 'A<_Ty>::Equals' : unable to match function definition to an existing declaration. Чуть поколупавшись, оказалось, что работает вот такой вариант:
template<>
bool A<char*>::Equals(char* const &a, char* const &b){ //WHY
return !strcmp(a, b);
}
char* const &a — сатана какой-то:DDD
UPD. В идеале надо было бы сделать Equals public'ом и friend'ом, а то немного не логично вышло, не ругайте:)









Equalsдолжен принимать ссылку на константный_Ty. Подставляем_Ty = const char *, получаем:Equalsдолжен принимать ссылку на константныйconst char *. В типеconst char *квалификаторconstотносится не к самому указателю, а к указуемым данным, то есть, это указатель на константныйchar. Совмещая вместе, получаем:Equalsдолжен принимать ссылку на константный указатель на константныйchar. Это записывается так:const char * const &. То есть, специализация должна бытьtemplate<> bool A<const char*>::Equals(const char * const& a, const char * const& b){ return !strcmp(a, b); }Для справки:
char *— указатель наcharconst char *— указатель на константныйcharchar * const— константный указатель наcharconst char * const— константный указатель на константныйcharСпасибо, разобрался:) А могли бы еще пояснить, почему эти записи эквивалентны
const char*иchar const*?Просто потому что они эквивалентны по определению (так написано в стандарте языка). Второй вариант предпочитают любители читать тип «справа налево» (т.е.,
), но, по-моему, выглядит он немного дико.
Я сам никогда так не писал, но вот моя догадка. Такое определение
предполагает, что аргументы
aиbдолжны быть неизменного типа, потому чтоconst. Следовательно, когда мы пишеммы тем самым указываем, что
aиbдолжны быть неизменными пойнтерами, то естьchar* const. Первый же вариант,const char* &a, не подходит под описание, потому что определяет тип как указатель на неизменяемыйchar, что, образно говоря, выглядит как-то так:(const char)* &a.В идеале надо было бы сделать Equals public'ом и friend'омЕсли функция — friend, то неважно, public она, protected или private.