Ошибка получения "недопустимые операнды типов`% T 'и `% T' для двоичного`% O 'в оценке `% Q (% # T,% # T)'" - PullRequest
1 голос
/ 16 сентября 2011

Я очень очень старался решить эту проблему. Мне всегда удавалось найти мой ответ через Google, и я впервые отправляю сообщения на форум из-за моей должной осмотрительности. Тем не менее, это полностью озадачило меня, и Google, похоже, рекомендует исходный код для 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*)’

и я сходил с ума, искал, использовал ли я «+» внутри функции, которую пытался использовать в качестве основы для +, а затем менял все виды указателей и еще много чего, и выводил их за пределы класса и внутри класса.

Завтра я могу сослаться на правило № 1 Общих правил перегрузки операторов , но сегодня я потратил 6 часов на то, что должно было занять четыре минуты, чтобы убедиться, что оно работает и двигаться вперед ... Я очень грустная панда.

Ответы [ 3 ]

4 голосов
/ 16 сентября 2011

Операторские перегрузки должны иметь хотя бы один аргумент пользовательского типа. Ваш код:

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 голос
/ 24 марта 2015

Я получил похожую ошибку: недопустимые операнды типов 'int64_t {aka long int}' и '' для двоичного 'оператора *', но по другой причине, чем OP.

Для меня я пыталсяумножьте значение на «индекс», который был объявлен ниже в функции.

К сожалению, кажется, что он жаловался на параметры функции до того момента, когда она действительно испортилась.Удаление "* index" из

int64_t x = 10, y = 10;
someFunction(&x, &y, size * index);
...
int index = 1;

решило проблему.Я думаю, бесполезное сообщение об ошибке.

1 голос
/ 16 сентября 2011

Исправление должно быть:

(*c_a) += *c_b;

Операторы в C ++ не «подняты» (как в функциональных языках, таких как, например, Haskell; C # имеет понятие поднятый оператор для типов Nullable )

Примечание @Daniel: Этот ответ ссылается на ответ на ваш вопрос («почему так должно быть»): C ++ не выполняет автоматические операторы с поднятыми значениями для указателей.Я предполагаю, что это, вероятно, главным образом потому, что C ++ хочет оставаться C-совместимым в отношении арифметики указателей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...