шаблоны — правильный шаблон для сравнения строк в переполнении стека

Я написал компаратор для строк в 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, которую я написал и которая работает правильно, сделает всю работу. Но что-то пошло не так.

0

Решение

В вашей специализации отсутствует декларация возврата:

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);
}

Это неопределенное поведение. На практике это приводит к случайному истину / ложь на сайте вызова, и поэтому кажется, что это «почти всегда неправильно».

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector