Почему я получаю сообщение об «инициализации»: невозможно преобразовать ошибку «список инициализаторов» в «_Objty» в C ++? - PullRequest
0 голосов
/ 30 декабря 2018

Я создаю программу, в которой пользователь должен идентифицировать определенные аккорды.Я использую SDL для рендеринга текста и фигур на графический интерфейс и SDL_Mixer для загрузки звуков.Программа потребует от пользователя воспроизвести звук и угадать звук, который воспроизводился с помощью ряда параметров.В остальном программа работает нормально.Однако проблема возникла, когда я попытался реализовать способ загрузки и работы со звуками.Весь приведенный ниже код инкапсулирован в класс.

Я попытался закомментировать некоторые части кода и обнаружил, что ошибка возникает, когда я пытаюсь добавить звуки в вектор с помощью emplace_back ().Ошибка возникает в строке 881 файла с именем xmemory0.Это код, в котором возникает ошибка "_Objty (_STD forward <_Types> (_ Args) ...);".

Этот код имеет свой спецификатор доступа, определенный как private

//Container to hold the sound data

std::vector<Sound*>Sounds;

//Container to hold the randomly selected sounds;
std::vector<Sound*> randomSounds;


Sound* aMinor{ new Sound{} };
Sound* aMajor{ new Sound{} };
Sound* a7{ new Sound{} };
Sound* aMajor7{ new Sound{} };
Sound* cMajor{ new Sound{} };
Sound* dMajor{ new Sound{} };
Sound* dMinor{ new Sound{} };
Sound* eMajor{ new Sound{} };
Sound* eMinor{ new Sound{} };
Sound* eMinor7{ new Sound{} };
Sound* eMajor7{ new Sound{} };
Sound* fMajor{ new Sound{} };
Sound* fMinor{ new Sound{} };
Sound* gMajor{ new Sound{} };

//These are the pointers for the randomly selected sounds
Sound* randomSoundLeft;
Sound* randomSoundMiddle;
Sound* randomSoundRight;

//Pointer for the sound which the user will play
Sound* currentPlayingSound;

Этот код определен в методе «загрузки данных»

//Add sounds to vector
Sounds.emplace_back(aMinor, aMajor, aMajor7,
a7,cMajor, dMajor, dMinor,
eMajor, eMajor7, eMinor, eMinor7,
fMajor, fMinor, gMajor);


//Load sounds
if (!aMinor->loadSound("Chords/A_minor.wav")
or !aMajor->loadSound("Chords/A_major.wav")
or !a7->loadSound("Chords/A_7.wav")
or !aMajor7->loadSound("Chords/A_major7.wav")
or !cMajor->loadSound("Chords/C_major.wav")
or !dMajor->loadSound("Chords/D_major.wav")
or !dMinor->loadSound("Chords/D_minor.wav")
or !eMajor->loadSound("Chords/E_major.wav")
or !eMajor7->loadSound("Chords/E_major7.wav")
or !eMinor->loadSound("Chords/E_minor.wav")
or !eMinor7->loadSound("Chords/E_minor7.wav")
or !fMajor->loadSound("Chords/F_major.wav")
or !fMinor->loadSound("Chords/F_minor.wav")
or !gMajor->loadSound("Chords/G_major.wav")) {

printf("One or more sounds couldn't be loaded! %s\n", Mix_GetError());
}


//Set chord names
aMinor->setChordName("A Minor", black, renderer, mediumFont);
aMajor->setChordName("A Major", black, renderer, mediumFont);
a7->setChordName("A7", black, renderer, mediumFont);
aMajor7->setChordName("A Major7", black, renderer, mediumFont);
cMajor->setChordName("C Major", black, renderer, mediumFont);
dMajor->setChordName("D Major", black, renderer, mediumFont);
dMinor->setChordName("D Minor", black, renderer, mediumFont);
eMajor->setChordName("E Major", black, renderer, mediumFont);
eMajor7->setChordName("E Major7", black, renderer, mediumFont);
eMinor->setChordName("E Minor", black, renderer, mediumFont);
eMinor7->setChordName("E Minor7", black, renderer, mediumFont);
fMajor->setChordName("F Major", black, renderer, mediumFont);
fMinor->setChordName("F Minor", black, renderer, mediumFont);
gMajor->setChordName("G Major", black, renderer, mediumFont);

Этот код определен в методе «обновления»

//Used to prevent this section running in the normal game loop
if (rounds == changeLevel) {

//Randomly choose sounds
randomSoundLeft = Sounds.at(rand() % Sounds.size());
randomSoundMiddle = Sounds.at(rand() % Sounds.size());
randomSoundRight = Sounds.at(rand() % Sounds.size());

//Create a new container and add the possible choices to the container
randomSounds.emplace_back(randomSoundLeft, randomSoundMiddle, randomSoundRight);

//Randomly chose one of the options to be the sound that the user plays
currentPlayingSound = randomSounds.at(rand() % randomSounds.size());

++changeLevel;


}

Я ожидал, что аккорды, содержащие имя и звук, будутбыть добавлены в вектор без проблем.Тем не менее, у меня есть эта ошибка: Ошибка C2440 «инициализация»: не удается преобразовать из «список инициализатора» в «_Objty»

1 Ответ

0 голосов
/ 01 января 2019

Метод emplace_back предназначен для наложения одного элемента.Он принимает произвольное количество аргументов, поскольку все они передаются в конструктор одного элемента.

Чтобы добавить много элементов одновременно, вам нужно использовать метод, который принимает диапазон итераторов или список инициализаторов.

Это должно работать:

Sounds.insert(Sounds.end(), {aMinor, aMajor, aMajor7,
a7,cMajor, dMajor, dMinor,
eMajor, eMajor7, eMinor, eMinor7,
fMajor, fMinor, gMajor});

Если ваша версия компилятора делаетне поддерживает списки инициализаторов, это будет работать:

Sound* inserted[] = {aMinor, aMajor, aMajor7,
a7,cMajor, dMajor, dMinor,
eMajor, eMajor7, eMinor, eMinor7,
fMajor, fMinor, gMajor};
Sounds.insert(Sounds.end(), inserted, inserted+sizeof(inserted)/sizeof(inserted[0]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...