如何解决类型'std::map<音频类型,常量字符*>"的"没有可行的重载运算符[]?

How to resolve `no viable overloaded operator[] for type 'std::map<AudioTypes, const char *>`?

本文关键字:类型 gt 运算符 重载 解决 何解决 std 常量 音频 lt map      更新时间:2023-10-16

所以我为了我的目的而遵循了这个 SO 答案,我真的不知道如何解决这个错误。当我尝试访问audioType[wav]audioType[mp3]时,会出现以下错误。查找互联网对我没有帮助。

error: no viable overloaded operator[] for type 'const std::map<AudioTypes, const char *>

note: candidate function not viable: 'this' argument has type 'const std::map<AudioTypes, const char *>', but method is not marked const mapped_type& operator[](const key_type& __k);

// WAVFile.h
class WAVFile {
    // ...
    private:
        enum AudioTypes: int;
        static std::map<AudioTypes, const char*> audioType;
    // ...
}
// WAVFile.cpp
enum AudioTypes: int {
    wav,
    mp3
};
static map<AudioTypes, const char*> audioType = {
    {wav, "wav"},
    {mp3, "mp3"}
};
bool WAVFile::exportAudio(const char* filename, const char* filetype) {
    // temporary test code    
    cout << audioType[wav] << endl;
    return true;
}
// main.cpp
int main() {
    file.exportAudio("export_i ran.wav","wav") ? cout << "Exportedn" : cout << "Failedn";
    return 0;
}

如前所述,该错误的原因是 - 正如错误消息所解释的那样 - std::mapoperator[]不是const限定的成员函数。(我对此有点惊讶,我以为有const过载)

一个可能的解决方法是使用成员函数 at ,它具有这个常量限定的重载,因此应该使用const限定的std::map s。

另请注意,在您显示的代码中可能存在问题:

class WAVFile {
        static std::map<AudioTypes, const char*> audioType;
}

static map<AudioTypes, const char*> audioType = {
    {wav, "wav"},
    {mp3, "mp3"}
};

不是同一个变量。您应该在定义之前添加类范围并删除static

map<AudioTypes, const char*> WAVFile::audioType = {
    {wav, "wav"},
    {mp3, "mp3"}
};

此外,您应该将enum AudioTypes的定义移动到标头,或者可能提供前向声明。

在修复了一些问题之后,特别是audioTypeAudioTypes之前缺少WAVFile::以及定义audioType之前的静态,这段代码构建:

#include <map>
#include <iostream>
using namespace std;
class WAVFile {
    public:
        bool exportAudio(const char* filename, const char* filetype);
    private:
        enum AudioTypes: int;
        static std::map<AudioTypes, const char*> audioType;
};
enum WAVFile::AudioTypes: int {
    wav,
    mp3
};
map<WAVFile::AudioTypes, const char*> WAVFile::audioType = {
    {wav, "wav"},
    {mp3, "mp3"}
};
bool WAVFile::exportAudio(const char* filename, const char* filetype) {
    cout << audioType[wav] << endl;
    return true;
}
int main() {
    WAVFile file;
    file.exportAudio("export_i ran.wav","wav") ? cout << "Exportedn" : cout << "Failedn";
    return 0;
}