SFML и Box2D setUserData не могут преобразовать аргумент из const char [4] в void *

#c #box2d #sfml

#c #box2d #sfml

Вопрос:

Я кодирую платформер на 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://www.youtube.com/watch?v=-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(amp;bdef);
body->CreateFixture(amp;shape, 2);
body->SetUserData("box"); 
  

Ответ №1:

Этот учебник, вероятно, основывался на несоответствующем поведении в VS, которое позволяло преобразовывать строковые литералы в неконстантный указатель на char . Поэтому вам следует либо изменить свой код, чтобы он был постоянным (рекомендуется), либо включить это старое поведение, используя /Zc:strictStrings- опцию компиляции (не рекомендуется).

Комментарии:

1. Кроме того, const char* box[] = {"box"} правильно ли это делается? Кажется, это все исправляет, но есть ли лучший способ сделать это? (не используя /Zc:stringStrings — хотя это также устранило проблему)

2. @Kerrot const char* box[] = {"box"} верно, но как это связано с SetUserData ? В любом случае, если вы используете эту строку для «тегирования» тела box2d, то, вероятно, было бы нормально просто привести его body->SetUserData(const_cast<char *>("box")); , а затем привести обратно к правильному типу static_cast<char const *>(body->GetUserData()) при его извлечении.

3. Хорошо, спасибо. const char* box[] = {«box}» связан, потому что я использовал его в setUserData.

4. @Kerrot Если const char* box[] = {"box"} был выделен стек, то сохраненный указатель пользовательских данных стал бы недействительным, как только поле вышло из области видимости.