首页 文章

错误C2678:二进制'!=':找不到带左手操作数的运算符

提问于
浏览
0
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就打破循环并返回tempReturn但是它一直给我这个错误:

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)

我怎么能在这里解决这个问题?

2 回答

  • 4

    如果您尝试将任意类型 T 与数字常量0进行比较,则模板代码存在一个基本问题,您在此处的代码中执行此操作:

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

    这里的问题是 T 是一个任意类型(在这种情况下,你似乎用 std::string 实例化模板),但你期望该类型可以与0相比 . 这非常好 - 它只是将 T 限制为类型可以与0进行比较 - 但是你不确定你是否意识到这一点 .

    你的选择要么不用 std::string 作为参数来实例化这个模板(它的方式是's written, I don'认为你不太确定你想要代码做什么,所以在后一种情况下我不确定我是如何协助的 .

    希望这能澄清事情!

  • 0

    对于与 0 无法直接比较的类型,您可以 specialize or overload 比较部分(此处为 != ) . 举个例子,

    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 ;它可以根据需要进行推广 . ]

相关问题