【问题标题】:templating a string comparator correctly in c++在 C++ 中正确模板化字符串比较器
【发布时间】:2013-12-15 22:36:37
【问题描述】:

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

【问题讨论】:

  • 只是一个抬头,下划线和后面的大写字母是保留标识符。
  • return S(a,b); 现在你没有返回任何东西(你的编译器应该发出警告)。
  • @jrok OMG 很抱歉打扰到这样的人。谢谢你指出来顺便说一句。这里是凌晨 4 点。因此愚蠢。如果您不介意,请将其添加为答案。
  • @jrok COMpiler 没有发出任何警告..我没有打开严格或墙..无论如何,谢谢。
  • @Potatoswatter 它确实解决了问题。不过,我要修复所有变量名。

标签: c++ templates stl comparator


【解决方案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);
}

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

【讨论】:

    猜你喜欢
    • 2021-09-03
    相关资源
    最近更新 更多