所以为了我的目的,我遵循了这个SO答案,我真的不知道如何解决这个错误。当我试图访问audioType[wav]
或audioType[mp3]
时,下面的错误出现了。查找互联网对我没有帮助。
错误:没有可行的重载运算符[]类型为constd::map
注意:候选函数不可行:“this”参数的类型为“const std::map”
// 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;
}
修复了一些问题,特别是audioType
和AudioTypes
之前缺少的WAVFile::
和AudioTypes
以及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 << "Exported\n" : cout << "Failed\n";
return 0;
}
匿名用户
如前所述,正如错误消息所解释的,该错误的原因是std::map
的operator[]
不是const
限定成员函数。(我对此有点惊讶,我以为有一个const
过载)
一种可能的修复方法是使用成员函数at
,该函数具有此const限定重载,因此应该使用const
qualifiedstd::map
s。
还要注意,在您展示的代码中,可能存在一个问题:
class WAVFile {
static std::map<AudioTypes, const char*> audioType;
}
和
static map<AudioTypes, const char*> audioType = {
{wav, "wav"},
{mp3, "mp3"}
};
不是同一个变量。您应该在定义之前添加类范围,并删除静态:
map<AudioTypes, const char*> WAVFile::audioType = {
{wav, "wav"},
{mp3, "mp3"}
};
此外,您应该将enum AudioTypes
的定义移动到标头,或者可能提供前置声明。
我试图为一个2D表示向量的类定义“-=”和“-”,但我得到了这个错误: vecteur2d.cc:131:7:错误:没有可行的重载“-=”VEC1-=VEC2;
前面章节介绍了 Python 中的各个序列类型,每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢? 其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作
首先,考虑这个C代码: 根据标准的预期,这将无法编译,因为< code>print在每个基类中都被单独考虑,以便进行重载解析,因此调用是不明确的。这是Clang (4.0)、gcc (6.3)和MSVC (17.0)的情况——见godbolt结果。 现在考虑以下片段,其唯一的区别是我们使用而不是: 我希望结果与前一种情况相同,但事实并非如此 - 虽然gcc仍然抱怨,但Clang和MSVC可以编译这
我在运算符过载时遇到问题 主要是我有 其中<code>Integer</code>只是<code>int</code>的包装,带有我需要的一些特殊功能。 然而,当我编译上面的代码时,我得到了错误C2679,它表示<code>binary' 我还试图删除友元声明中的参数,因此代码变成了: 但这会产生另一个错误:C2785:
Rust可以让我们对某些运算符进行重载,这其中大部分的重载都是对std::ops下的trait进行重载而实现的。 重载加法 我们现在来实现一个只支持加法的阉割版复数: use std::ops::Add; #[derive(Debug)] struct Complex { a: f64, b: f64, } impl Add for Complex { type Outpu
我在surf.h中有以下代码,其中声明了一个具有两种不同类型的模板类: 然后定义一个新类,其中创建了一个类型为T的向量(在field.h中) 在main.cpp中,我使用了这个字段。 我用G++(版本5.4)编译它,得到以下错误: 从main.cpp:2:0:field.h:在“std::ostream&operator<<(std::ostream&,const field&)[with T=s