我已经非常努力地解决了这个问题。我一直能够通过谷歌找到我的答案,这是我第一次因为我的尽职调查而发布到论坛。但是,这完全让我感到难过,谷歌似乎在推荐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分钟才能确认它正在工作并继续前进的事情......我是一个非常伤心的熊猫。
答案 0 :(得分: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
都是指针,它们不是用户定义的类型。
答案 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;
修复了问题。我猜是无用的错误消息。