如何解决类型'std::map<音频类型,常量字符*>"的"没有可行的重载运算符[]?
How to resolve `no viable overloaded operator[] for type 'std::map<AudioTypes, const char *>`?
所以我为了我的目的而遵循了这个 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::map
的operator[]
不是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
的定义移动到标头,或者可能提供前向声明。
在修复了一些问题之后,特别是audioType
和AudioTypes
之前缺少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;
}
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型