C++ 接收错误“;类型为“%T';和`%T';到二进制文件“%O';在`%Q(%#T,%#T)'&引用;

C++ 接收错误“;类型为“%T';和`%T';到二进制文件“%O';在`%Q(%#T,%#T)'&引用;,c++,operator-overloading,C++,Operator Overloading,我非常非常努力地解决这个问题。我一直都能通过谷歌找到我的答案,这是我第一次因为我的尽职调查而发布到论坛上。然而,这完全难住了我,谷歌似乎正在推荐,这对我来说,这是一个罕见的问题 以下是我的简化代码: #include <sstream> #include <string> #include <stdio.h> #include <stdlib.h> using namespace std; class DJPchar{ public:

我非常非常努力地解决这个问题。我一直都能通过谷歌找到我的答案,这是我第一次因为我的尽职调查而发布到论坛上。然而,这完全难住了我,谷歌似乎正在推荐,这对我来说,这是一个罕见的问题

以下是我的简化代码:

#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;
}
我一直在发疯,寻找是否在我试图用作+,基础的函数中使用了“+”,然后改变各种各样的指针等等,把它放在类外和类内


明天,我可能会参考第1条规则,但今天我花了6个小时做了一件事情,本来要花4分钟来验证它是否有效并继续前进。。。我是一只非常悲伤的熊猫。

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

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

c_a += c_b; //Error Line

c_a
c_b
都是指针,不是用户定义的类型

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

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

c_a += c_b; //Error Line
c_a
c_b
都是指针,不是用户定义的类型

修复应该是:

(*c_a) += *c_b;

C++中的运算符不是“解除”(像函数语言一样,例如Haskell;C的概念)

<丹尼尔>:这个答案引用了你的问题的答案(“为什么它应该是这样的”):C++没有为指针做自动提升操作符。我想这可能主要是因为C++希望保持C兼容,而

< P>修复应该是:

(*c_a) += *c_b;

C++中的运算符不是“解除”(像函数语言一样,例如Haskell;C的概念)

<丹尼尔>:这个答案引用了你的问题的答案(“为什么它应该是这样的”):C++没有为指针做自动提升操作符。我想这可能主要是因为C++想要保持C兼容,而

我得到了类似的结果。 错误:“int64_t{aka long int}”和“to binary”运算符*类型的操作数无效 但原因与OP不同

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

不幸的是,它似乎在抱怨函数的参数,而不是实际的坏部分。从中删除“*索引”

解决了这个问题。我猜是无用的错误消息。

我得到了类似的消息 错误:“int64_t{aka long int}”和“to binary”运算符*类型的操作数无效 但原因与OP不同

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

不幸的是,它似乎在抱怨函数的参数,而不是实际的坏部分。从中删除“*索引”


解决了这个问题。我猜这是一条毫无帮助的错误消息。

哦,天啊,天啊,天啊。。。在发布后14秒内完全解决了这个问题。。。正如它所要求的,它希望我将c_a+=c_b发布为*c_a+=*c_b我不完全理解为什么会是这样,但当我再一次看到这个错误时,就很清楚了。。。我将把这件事作为我白痴的证明(不要开玩笑,我花了六个小时在这件事上,本应该花六个小时十五秒…)并作为一个警告,如果其他人在指针数学101中偶然发现这个错误…哦,那可能是真的。这是我的类的一个更大的测试平台的一部分,因此动态地分配DJPchar对象并将其添加到其他对象中。这部分代码可能已经被删除了。“为无符号字符重新创建字符串类”-因此本质上您正在寻找
std::basic_string
?哇。谢谢大家这么快的回复!我以为这会是一夜之间的修复,但非常感谢大家!它通常有助于读取错误消息(而不仅仅是识别是否存在错误和行)。至于答案的速度,所以(不是你15岁,而是奥利正确回答的3米),我同意这是惊人的。哦,天啊,天啊,天啊。。。在发布后14秒内完全解决了这个问题。。。正如它所要求的,它希望我将c_a+=c_b发布为*c_a+=*c_b我不完全理解为什么会是这样,但当我再一次看到这个错误时,就很清楚了。。。我将把这件事作为我白痴的证明(不要开玩笑,我花了六个小时在这件事上,本应该花六个小时十五秒…)并作为一个警告,如果其他人在指针数学101中偶然发现这个错误…哦,那可能是真的。这是我的类的一个更大的测试平台的一部分,因此动态地分配DJPchar对象并将其添加到其他对象中。这部分代码可能已经被删除了。“为无符号字符重新创建字符串类”-因此本质上您正在寻找
std::basic_string
?哇。谢谢大家这么快的回复!我以为这会是一夜之间的修复,但非常感谢大家!它通常有助于读取错误消息(而不仅仅是识别是否存在错误和行)。至于答案的速度(不是你的15秒,而是奥利正确回答的3米),我同意这是惊人的。还没有+1,因为(a)您没有展示如何修复它(b)您没有解决问题中的“为什么应该这样”部分。这个答案可能更有用。@sehe:很公平。但解决办法应该是显而易见的。“为什么”与问题并不相关(请注意,指针并不是运算符重载规则适用的唯一基本类型)。OP搜索了6个小时。他即将“阅读gcc的来源”。我不能同意