【问题标题】:error C2678: binary '!=' : no operator found which takes a left-hand operand错误 C2678:二进制“!=”:未找到采用左操作数的运算符
【发布时间】:2012-01-20 03:27:41
【问题描述】:
template<typename T> T SmartIO::Peek() {
    T temp;
    T tempReturn;

    while(true){
        temp = *(T*)&buffer[ptrSeek];

        if(temp !=0){
            ptrSeek++;
            tempReturn += *(T*)&buffer[ptrSeek];
        }
        else{
            break;
        }
    }

    return tempReturn;
}

所以我想要做的是,从 ptrSeek 开始读取开始循环,将值添加到 temp 并检查 temp 的值是否!=0 将此值添加到 tempReturn,一旦 temp 的值为 0,就打破循环并返回tempReturnbut,但它一直给我这个错误:

error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::basic_string<_Elem,_Traits,_Ax>' (or there is no acceptable conversion)

我该如何解决这个问题?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    如果您尝试将任意类型 T 与数字常量 0 进行比较,那么您的模板代码存在一个基本问题,您在此处的代码中正在这样做:

    T temp;
    
    /* ... */
    
    if(temp != 0){
         /* ... */
    }
    

    这里的问题是T 是一个任意类型(在这种情况下,您似乎正在使用std::string 实例化模板),但您希望该类型与0 相当。这很好 -它只是将 T 限制为可以与 0 进行比较的类型 - 但鉴于您将此报告为错误,我不确定您是否知道这一点。

    您的选择是不使用 std::string 作为参数来实例化此模板(按照它的编写方式,我认为您不应该这样做,因为它看起来像函数不断添加值某种类型的一起),或调试模板并更改其行为。我不太确定你想让代码做什么,所以在后一种情况下我不确定我能提供什么帮助。

    希望这可以澄清事情!

    【讨论】:

    • 我想做的就是检查 temp 是否有值,如果没有值,我将打破循环。
    • “有价值与否”是什么意思?一切都有价值。您的意思是它是否具有您关心的特定价值?
    • 好吧,我希望它返回下一个可用字符,这是我的主要观点,然后我想将其作为模板,这样我就可以返回下一个可用类型,然后将其传递给模板!
    【解决方案2】:

    您可以特化或重载比较部分(此处为!=),用于无法直接与0 比较的类型。只是一个例子,

    template<typename T>
    bool NotEqualto0 (const T& obj) { return (obj != 0); }
    
    // overload for std::string    
    bool NotEqualto0 (const std::string &s) { return (s.c_str() != 0); }
    
    ...
    if(NotEqualto0(temp))
    ...
    

    [上面的函数是硬连线的0;可以根据需要进行概括。]

    【讨论】:

    • 这落后于我的整个电脑它使用了我的整个内存和 cpu 迫使我重新启动电脑!
    • @MixedCoder,它不应该发生。我在代码中没有看到任何错误,我已经发布了。字符串形成是否发生不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多