Я написал компаратор для строк в C ++
template <class T> class AStringComparator // primary template declaration
{
public:
bool operator()( T, T );
};template <> class AStringComparator<std::basic_string<char> >
{
public:
bool operator()( std::basic_string<char> _A, std::basic_string<char> _B )
{
//all the code here
}
}
Затем я попытался создать шаблон для const char*
как это:
template <> class AStringComparator<char const *>
{
public:
bool operator()( char const * _A, char const * _B )
{
AStringComparator<std::basic_string<char> > S;
std::basic_string<char> a(_A);
std::basic_string<char> b(_B);
S( a, b );
}
};
Это компилирует и запускает, но дает неправильные результаты почти всегда. Я думаю, что я сделал ошибку в реализации const char*
версия. Можете ли вы указать это. Мое намерение состояло в том, чтобы преобразовать const char*
Перейдем к basic_string, а затем пусть оригинальная функция для basic_string, которую я написал и которая работает правильно, сделает всю работу. Но что-то пошло не так.
В вашей специализации отсутствует декларация возврата:
bool operator()( char const * _A, char const * _B )
{
AStringComparator<std::basic_string<char> > S;
std::basic_string<char> a(_A);
std::basic_string<char> b(_B);
S( a, b ); // <----------------- should be return S(a,b);
}
Это неопределенное поведение. На практике это приводит к случайному истину / ложь на сайте вызова, и поэтому кажется, что это «почти всегда неправильно».
Других решений пока нет …