c++ - 为什么我得到一个 "' 初始化' : cannot convert from 'initializer list' to '_Objty' "error in C++?

标签 c++ visual-c++

我正在创建一个程序,用户必须在其中识别某些和弦。我正在使用 SDL 将文本和形状渲染到 GUI 上,并使用 SDL_Mixer 加载声音。该程序将要求用户播放声音并使用一系列选项猜测播放的声音。该程序的其余部分工作正常。但是,一旦我尝试实现一种加载和处理声音的方法,就会出现问题。以下所有代码都封装在一个类中。

我尝试注释掉代码的某些部分,但我发现当我尝试使用 emplace_back() 将声音添加到 vector 时会发生错误。错误发生在名为 xmemory0 的文件的第 881 行。这是发生错误“_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;


}

我希望将包含名称和声音的和弦毫无问题地添加到 vector 中。但是,我有这个错误: 错误 C2440“正在初始化”:无法从“初始化程序列表”转换为“_Objty”

最佳答案

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]));

关于c++ - 为什么我得到一个 "' 初始化' : cannot convert from 'initializer list' to '_Objty' "error in C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53979731/

相关文章:

c - 如何防止 Visual C++ 链接器包含地址被占用的每个函数?

docker - 在 Windows Docker 容器上安装 MS Build Tools 失败

python - 将 OpenCv Mat 从 C++ 传递到 Python

c++ - 为什么std::optional <bool>使用两个字节?

c++ - wxTextCtrl 类的 GetValue 方法使我的应用程序崩溃

c++ - 在 Visual Studio 中链接 DLL

c++ - InDev 基于位的加密程序中未知的 C++ 堆损坏,C++ 编程的新手

c++ - 在 C++ 中的 vector/数组中存储不同类型的元素?

c++ - 如何在 C++ 的 openCV 中调用 cv MorphologyEx?

c++ - 部分特化类的成员定义