我在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);
}
这是未定义的行为。在实践中,它会导致呼叫站点出现随机的真/假,这就是为什么它似乎"几乎总是错误的"。