С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71

No operator "==" matches these operands

21.09.2021, 18:34. Показов 2250. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В библиотеке box2d отрисовка динамического тела многие делают таким образом :

C++
1
2
3
4
5
6
7
8
9
10
11
for (b2Body* it = world.GetBodyList(); it !=0; it = it->GetNext())
        {
            if (it->GetUserData() == (void *)("dynamic"))
            {
                b2Vec2 pos = it->GetPosition();
                float angle = it->GetAngle();
                dynamic_body.setPosition(pos.x/SCALE,pos.y/SCALE);
                dynamic_body.setRotation(angle*DEG);
                window.draw(dynamic_body);
            }
        }
в некоторых без преобразования в void * .
Тем не менее в любом из случаев выдается ошибка об отсутствии операции == для операторов таких
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2021, 18:34
Ответы с готовыми решениями:

Вывод строки с cout: IntelliSense: no operator "<<" matches these operands
ошибку выдает 3 IntelliSense: no operator &quot;&lt;&lt;&quot; matches these operands operand types are: std::ostream &lt;&lt;...

IntelliSense: no operator ">>" matches these operands
// Лаба 1 С++.cpp : Defines the entry point for the console application. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Error: no operator "<<" matches these operands
Чем может быть вызвана эта ошибка? cout&lt;&lt;pObj-&gt;GetName()

22
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
21.09.2021, 18:41
А почему адрес константной строки "dynamic" должен совпадать с адресом, который возвращается методом GetUserData()?
Он же не знает, где расположена эта строка.
Может, Вы имели ввиду
C++
1
if( strcmp(it->GetUserData() ,"dynamic")==0 )
?????
1
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
21.09.2021, 19:01
Цитата Сообщение от slverwolf Посмотреть сообщение
многие делают
кто они? Студенты ?
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
21.09.2021, 19:27  [ТС]
не ,просто в гайдосах разных))

Добавлено через 20 минут
при таком положении дел выдает следующую ошибку : no suitable conversion function from "b2BodyUserData" to "const char *" exists
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
21.09.2021, 19:43
Цитата Сообщение от slverwolf Посмотреть сообщение
в гайдосах разных
где такое увидишь - закрывай сразу, они научат только плохому.

А строки лучше храни в std::string и сравнивай спокойно и безопасно
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
21.09.2021, 20:24  [ТС]
и тем не менее как мне преобразовать это значение ,полученное от итерации в строку в таком случае?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
21.09.2021, 20:52
slverwolf, а что не так в моем предложении?
Тут, ведь явно видно, что сравнить нужно две char строки.
strcmp для этого и предназначена.
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
21.09.2021, 20:59
slverwolf, не надо ничего преобразовывать

Покажи компилирующийся пример с проблемой
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
21.09.2021, 21:04  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <SFML/Graphics.hpp>
#include "box2d/box2d.h"
using namespace sf;
b2Vec2 gravity(0.f, 9.8f);
b2World world(gravity);
float scale(float x)
{
    return x / 30.f;
}
float deg(float x)
{
    return x / 57.29577f;
}
float rScale(float x)
{
    return x * 30.f;
}
float rdeg(float x)
{
    return x * 57.29577f;
}
 
void setGround(int x, int y, int w, int h)//ширина,высота.центр в точке xy 
{
    b2PolygonShape b2ground;
    b2ground.SetAsBox(scale(w), scale(h));
    b2BodyDef bdef;
    bdef.position.Set(scale(x), scale(y));
    b2Body* b_ground = world.CreateBody(&bdef);
    b_ground->CreateFixture(&b2ground, 1);
}
 
int main()
{
    RenderWindow window(VideoMode(1600, 540), "SFML works!");
    window.setFramerateLimit(70);
 
    Image image1, image2, image3;
    image1.loadFromFile("images\\use\\Hero\\Run.png");
    image1.createMaskFromColor(Color(255, 255, 255));
    image2.loadFromFile("Images\\Use\\Terrain\\box.png");
    image2.createMaskFromColor(Color(255, 255, 255));
    image3.loadFromFile("Images\\Use\\Terrain\\wall.png");
 
    Texture t1, t2, t3;
    t1.loadFromImage(image1);
    t2.loadFromImage(image2);
    t3.loadFromImage(image3);
    t3.setRepeated(true);
    t1.setSmooth(true);
 
    Sprite sPlayer(t1), sBox(t2), sGround(t3);
 
    sPlayer.setTextureRect(IntRect(0, 0, 37, 29));
    sBox.setTextureRect(IntRect(0, 0, 21, 16));
 
    sGround.setTextureRect(IntRect(0, 0, 75 * 25, 96));
    sGround.setPosition(0, 500);
 
    // BOX2D
    //Ground
    setGround((75 * 25) / 2, (500 + 96) / 2, 75 * 25, 96);
    //Player
    b2PolygonShape shape;
    shape.SetAsBox(scale(37/2), scale(29/2));
 
    b2BodyDef bdef;
    bdef.type = b2_dynamicBody;
    bdef.position.Set(scale(600), scale(100));
    b2Body *boxBody = world.CreateBody(&bdef);
    boxBody->CreateFixture(&shape, 2);
    boxBody->SetUserData((void*)("dynamic"));
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        world.Step(1 / 60.f, 8, 3);
        window.clear(Color(107, 140, 255));
        window.draw(sGround);
        for (b2Body* it = world.GetBodyList(); it != 0; it = it->GetNext())
        {
            if (strcmp(it->GetUserData(), "dynamic") == 0)                   //Ошибка
 
 
            {
                b2Vec2 pos = it->GetPosition();
                float angle = it->GetAngle();
                sBox.setPosition(rScale(pos.x), rScale(pos.y));
                sBox.setRotation(rdeg(angle));
                window.draw(sBox);
            }
        }
        window.display();
    }
    return 0;
}
вот собственно код.
Ругается на помеченную строку так: no suitable conversion function from "b2BodyUserData" to "const char *" exists
видимо это говорит о том, что нет подходящего преобразователя
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
21.09.2021, 21:13
В описании написано, что GetUserData() возвращает b2BodyUserData& тип.
Если Вы уверены, что это точно char*, то
C++
1
 if (strcmp((char*)(it->GetUserData()), "dynamic") == 0)
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
21.09.2021, 21:28
slverwolf, не видно, что возвращает GetUserData() , точнее какого оно типа.

вот, нашёл https://box2d.org/documentatio... ource.html
C++
1
2
3
4
5
6
7
8
9
 struct B2_API b2BodyUserData
 {
     b2BodyUserData()
     {
         pointer = 0;
     }
  
     uintptr_t pointer;
 };
но что валяется по этому указателю - неизвестно
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
21.09.2021, 21:37  [ТС]
C++
1
2
3
4
inline b2BodyUserData& b2Body::GetUserData()
{
    return m_userData;
}
C++
1
b2BodyUserData m_userData;
C++
1
2
3
4
5
6
7
8
9
10
struct B2_API b2BodyUserData
{
    b2BodyUserData()
    {
        pointer = 0;
    }
 
    /// For legacy compatibility
    uintptr_t pointer;
};
Есть еще метод void SetUserData(void* data);
которым в теории я и назначаю содержимое.
указатель типа void указывает же на тип данных,что я ему отправлю,нет?

Это внутри библиотеки отрыл
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
21.09.2021, 21:43
а, это даже и не указатель, это целочисленный тип, который может вместить в себя указатель, конвертированный к этому типу
uintptr_t
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
21.09.2021, 21:45
C++
1
if (strcmp((const char*)(it->GetUserData()->pointer), "dynamic") == 0)
1
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
21.09.2021, 22:20  [ТС]
operator -> or ->* applied to "b2BodyUserData" instead of to a pointer type
Не ,не работаец(
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
22.09.2021, 06:12
Цитата Сообщение от slverwolf Посмотреть сообщение
не ,просто в гайдосах разных))
Вы выдумываете.
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
22.09.2021, 07:23  [ТС]
Если это вам так принципиально, я могу предоставить ссылки. Тем не менее ради своего удовольствия людей лжецами называть....
Негодник ^^
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
22.09.2021, 10:05
Цитата Сообщение от slverwolf Посмотреть сообщение
operator -> or ->* applied to "b2BodyUserData" instead of to a pointer type
Не ,не работаец(
Очевидно же, что он просто опечатался.
Должно было быть так:
C++
1
if (strcmp((const char*)(it->GetUserData().pointer), "dynamic") == 0)
Добавлено через 8 минут
Цитата Сообщение от slverwolf Посмотреть сообщение
Если это вам так принципиально, я могу предоставить ссылки.
Было бы интересно посмотреть. Однако я дам 95%, что там использовался другой GetUserData, из другого класса (например из b2DynamicTree, который как раз возвращает void*). Вот в случае этого варианта такое сравнение могло быть использовано при условии, что в условном SetUserData указана такая же строка. Однако оно все равно остается некорректным, т.к. нет никаких гарантий, что компилятор "схлопывает" одинаковые строки в один storage. Такое может быть на практике, но это не гарантируется.
Либо речь шла о какой-то другой, более ранней версии библиотеки, где b2Body::GetUserData еще возвращал void*. В любом случае, нужно всегда учитывать такие вещи при анализе каких-то статей и руководств.
0
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,330
Записей в блоге: 2
22.09.2021, 10:24
Цитата Сообщение от slverwolf Посмотреть сообщение
многие делают таким образом
Помню когда изучал box2d обнаружил, что все (как сейчас не знаю, но скорее всего большинство, если не все) уроки/гайды/примеры используют старую версию движка (ведь это 2д физический движок), где usedData имела как раз таки тип void*, в новых версиях поменяли и надо менять.
Про userData есть страничка на офф сайте
Цитата Сообщение от DrOffset Посмотреть сообщение
Либо речь шла о какой-то другой, более ранней версии библиотеки, где b2Body::GetUserData еще возвращал void*. В любом случае, нужно всегда учитывать такие вещи при анализе каких-то статей и руководств.
В точку
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
22.09.2021, 12:07  [ТС]
Возможно как раз из-за различий в версиях такое происходит. Потому что он и впрямь шестилетней давности.
Миниатюры
No operator "==" matches these operands  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2021, 12:07
Помогаю со студенческими работами здесь

Ошибка: no operator ">>" matches these operands
моя задача создать двойной динамический массив (NxN) и с помощью дружественной функции вывести диагональ этого массива #include...

No operator "[]" matches these operands
Здравствуйте. Столкнулся со следующей ошибкой - &quot;no operator &quot;&quot; matches these operands&quot; (в 7-ой и 8-ой строчках). Подскажите, как исправить...

no operator">>" matches these operands
Кто может обьяснить почему компилятор показывает здесь: no operator&quot;&gt;&gt;&quot; matches these operands? int main() { int delta; int...

no operator ">>" matches these operands
Есть код с структурой. Всё неплохо идет, вроде, но когда пытаюсь ввести массив из 5 оценок здесь :Student * Amark = new Student ; for...

No operator "==" matches these operands
Может кто объяснить чем вызваны ошибки в коде? http://pastebin.com/8wu2gScd


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru