如何解决类型“std::map<AudioTypes, const char *>”的“无可行重载运算符[]”问题?

Nog*_*enn 4 c++ c++11

所以我为了我的目的遵循了这个SO 答案,我真的不知道如何解决这个错误。当我尝试访问audioType[wav]or 时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 << "Exported\n" : cout << "Failed\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*our 6

正如已经指出的那样,该错误的原因是 - 正如错误消息所解释的那样 - operator[]ofstd::map不是const合格的成员函数。(我对此有点惊讶,我以为有const超载)

一个可能的解决方法是使用成员 functionat,它具有这个 const 限定的重载,因此应该与const限定的std::maps一起工作。

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

class WAVFile {
        static std::map<AudioTypes, const char*> audioType;
}
Run Code Online (Sandbox Code Playgroud)

static map<AudioTypes, const char*> audioType = {
    {wav, "wav"},
    {mp3, "mp3"}
};
Run Code Online (Sandbox Code Playgroud)

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

map<AudioTypes, const char*> WAVFile::audioType = {
    {wav, "wav"},
    {mp3, "mp3"}
};
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

11669 次

最近记录:

9 年,9 月 前