Пишу платформер в sfml и box2d, хочу закодировать какие-то ящики, которые могу передвигать, но почему-то body->SetUserData("box")
говорит, что не может convert const char [4] to void *
. Я следую учебнику. В учебнике все работает нормально, но у меня появляется эта ошибка:
Error C2664 'void b2Body::SetUserData(void *)': cannot convert argument 1 from 'const char [4]' to 'void *'
Учебник: (есть на русском языке) https://thewikihow.com/video_-eJXg2tGcyM
Код для коробки:
b2PolygonShape shape;
shape.SetAsBox(30 / SCALE, 30 / SCALE);
b2BodyDef bdef;
bdef.type = b2_dynamicBody;
bdef.position.Set(600 / SCALE, 100 / SCALE);
b2Body *body = World.CreateBody(&bdef);
body->CreateFixture(&shape, 2);
body->SetUserData("box");
Этот учебник, вероятно, основывался на несовместимом поведении в VS, которое позволяло преобразовывать строковые литералы в неконстантный указатель на char
. Таким образом, вы должны либо изменить свой код, чтобы он был корректным (рекомендуется), либо включить это старое поведение, используя /Zc:strictStrings-
вариант компиляции (не рекомендуется).
@Kerrot const char* box[] = {"box"}
правильно, но как это связано с SetUserData
? В любом случае, если вы используете эту строку для «пометки» тела box2d, то, вероятно, было бы нормально просто привести body->SetUserData(const_cast<char *>("box"));
, а затем вернуть правильный тип static_cast<char const *>(body->GetUserData())
при его извлечении.
Спасибо. const char* box[] = {"box}" связан, потому что я использовал его в SetUserData.
@Kerrot Если бы const char* box[] = {"box"}
был выделен стеком, то сохраненный указатель пользовательских данных стал бы недействительным, как только поле выйдет за пределы области действия.
Кроме того, делает ли это
const char* box[] = {"box"}
правильно? Кажется, все исправлено, но есть ли лучший способ сделать это? (не используя /Zc:stringStrings- хотя это также устранило проблему)