我在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 :(得分:1)
您的专业化缺少退货声明:
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);
}
这是未定义的行为。在实践中,它会在呼叫站点产生随机的真/假,这就是为什么它似乎“几乎总是错误的”。