在评估'%Q(%#T,%#T)'时接收错误“类型'%T'和'%T'的无效操作数到二进制'%O'”

时间:2011-09-16 10:39:04

标签: c++ operator-overloading

我已经非常努力地解决了这个问题。我一直能够通过谷歌找到我的答案,这是我第一次因为我的尽职调查而发布到论坛。但是,这完全让我感到难过,谷歌似乎在推荐source code for gcc,这对我来说这个问题很少见。

这是我的简化代码:

#include <sstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

class DJPchar{
    public:
    //General Variables
        unsigned char *word;
        int length;

    //Initialization Functions
    DJPchar();
    DJPchar(unsigned char *w, int len);
    ~DJPchar();

    DJPchar& operator+=(const DJPchar& word2);
    };

/////////////////////////////////////////////////////////////
//Initialization Functions
/////////////////////////////////////////////////////////////
DJPchar::DJPchar(){
    word = NULL;
    length = 0;
    }

DJPchar::DJPchar(unsigned char *w, int len){
    int i;

    length = len;
    word = new unsigned char[length];
    for (i=0; i<length; i++){
        word[i] = w[i];
        }
    }

DJPchar::~DJPchar(){
    delete[] word;
    }

/////////////////////////////////////////////////////////////
//Problem Function
/////////////////////////////////////////////////////////////

DJPchar& DJPchar::operator+=(const DJPchar &word2){
    unsigned char *temp;
    int i, newlength;

    temp = this->word;
    newlength = this->length + word2.length;

    this->word = new unsigned char (newlength);

    for(i=0; i<this->length; i++){
        this->word[i] = temp[i];
        }
    for(i=this->length; i<newlength; i++){
        this->word[i] = word2.word[i-this->length];
        }

    this->length = newlength;
    delete[] temp;

    return *this;
    }

int main(){
    unsigned char a;
    unsigned char b[7];

    a = 'b';
    b[0] = 'b';
        b[1] = 'a';
        b[2] = 't';
        b[3] = '\n';
        b[4] = 200;
        b[5] = 'n';
        b[6] = '!';

    DJPchar *c_a = new DJPchar(&a, 1);
    DJPchar *c_b = new DJPchar(b, 7);

    c_a += c_b; //Error Line

    return 0;
}

我创建了一个大型的比较函数列表(我正在尝试为无符号字符重新创建字符串类,如果有人知道存在的东西,那就会膨胀!)并且它们都运行良好,但是错误我一直在为此而努力:

Broken.cpp:86: error: invalid operands of types ‘DJPchar*’ and ‘DJPchar*’ to binary ‘operator+’
Broken.cpp:86: error:   in evaluation of ‘operator+=(class DJPchar*, class DJPchar*)’

我已经疯了,寻找我是否在我试图使用的函数中使用'+'作为+的基础,然后更改各种指针和诸如此类的东西,并将它放在课外在课堂内。

明天,我可以参考General rules of Operator overloading的规则#1,但是今天我已经花了6个小时做一些应该用了4分钟才能确认它正在工作并继续前进的事情......我是一个非常伤心的熊猫。

3 个答案:

答案 0 :(得分:4)

运算符重载必须至少有一个参数是用户定义的类型。您的代码是:

DJPchar *c_a = new DJPchar(&a, 1);
DJPchar *c_b = new DJPchar(b, 7);

c_a += c_b; //Error Line

c_ac_b都是指针,它们不是用户定义的类型。

答案 1 :(得分:1)

修复应该是:

(*c_a) += *c_b;

C ++中的运算符不会被“解除”(就像在函数式语言中一样,例如Haskell; C#的概念是lifted operator for Nullable types

注意 @Daniel:这个答案引用了你的问题的答案(“为什么它应该这样”):C ++没有为指针自动提升运算符。我想这可能主要是因为C ++希望保持与pointer arithmetic的C兼容。

答案 2 :(得分:1)

我得到了类似的 错误:类型'int64_t {aka long int}'和''to binary'operator *'的操作数无效 但出于与OP不同的原因。

对我来说,我试图将一个值乘以“index”,该值已在函数中进一步声明。

可悲的是,它似乎在实际的坏部分之前抱怨函数的参数。从

中删除“* index”
int64_t x = 10, y = 10;
someFunction(&x, &y, size * index);
...
int index = 1;

修复了问题。我猜是无用的错误消息。