在c ++中正确模板化字符串比较器

时间:2013-12-15 22:36:38

标签: c++ templates stl comparator

我在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的原始函数正常工作。但事情发生了可怕的错误。

1 个答案:

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

这是未定义的行为。在实践中,它会在呼叫站点产生随机的真/假,这就是为什么它似乎“几乎总是错误的”。