当前位置: 首页 > 知识库问答 >
问题:

如何解决'没有可行的重载运算符[]类型'std::映射`? [重复]

卫劲
2023-03-14

所以为了我的目的,我遵循了这个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;
}

共有2个答案

孔硕
2023-03-14

修复了一些问题,特别是audioTypeAudioTypes之前缺少的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;
}
鲁旭
2023-03-14
匿名用户

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

一种可能的修复方法是使用成员函数at,该函数具有此const限定重载,因此应该使用constqualifiedstd::maps。

还要注意,在您展示的代码中,可能存在一个问题:

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