【问题标题】:g++ error in compiling while using std::string[5] as a type in std::map<>使用 std::string[5] 作为 std::map<> 中的类型时编译时出现 g++ 错误
【发布时间】:2021-09-07 18:29:48
【问题描述】:

我对 c++ 还很陌生,我正在制作一个加密器来改进我的 c++,起初我将 Cryptographer 类保存在 cryptographer.hpp 中,然后在 cryptographer.cpp 中添加了函数体,然后将 cryptographer.hpp 包含在 main.cpp 中它给了我一个编译器错误,所以我只是像这样将代码粘贴到main.cpp

#include <iostream>
#include <map>

class Cryptographer{
    public:
        int n_factor;
        std::string text;
        Cryptographer(std::string user_arg, int user_n_factor);
        struct cryptographer
        {
            std::string encrypted_text;
            std::string generated_key="";
        };
        cryptographer crypted_text;
        void generate_key();
        void encrypt();
        void decrypt();
        std::string get_key();
        std::string get_text();
};

using key_map = std::map<char, std::string[5]>;

void Cryptographer::generate_key(){
    for (int _ = 0; _ < 5; _++){
        crypted_text.generated_key += rand() % 26 + 65;
    }
}

void Cryptographer::encrypt(){
    generate_key();
    key_map keyHashMap;
    for (auto key_letter: crypted_text.generated_key){
        int key_letter_int = (int) key_letter;
        std::string key_letter_arr[5];
        int memory_number = key_letter_int;
        
        for (int index=0; index < 5; index++){
            if (memory_number+n_factor > 91){
                memory_number = 65;
            }else{
             key_letter_arr[5] = std::string(1, char (memory_number + n_factor));
             memory_number += n_factor;   
            }
        }
        keyHashMap.emplace(key_letter, key_letter_arr);
    }
    for(int index=0; index<text.size(); index++){
        int key = index %4;
        int key_patter = rand()% 4;
        int checking_index = 0;
        for (auto &elem: keyHashMap){
            if (checking_index == key){
                std::cout << elem.second[1];
            }
        }
    }
    crypted_text.encrypted_text = "test";
}

Cryptographer::Cryptographer(std::string user_arg, int user_n_factor):
    text(user_arg), n_factor(user_n_factor)
{}



int main(){
    Cryptographer crypter("hello guys", 3);
    crypter.encrypt();
    std::cout << crypter.get_text();
    return 0;
}

并在我的终端中运行它

g++ main.cpp -o test 它弹出了这个大错误 https://hastebin.com/cibeyanoro.cpp

我使用的是 ubuntu 20.04,我也尝试删除并重新安装最新版本的 g++,但弹出相同的错误。

【问题讨论】:

  • using key_map = std::map&lt;std::string, std::string[5]&gt;; 你确定你想要一个包含五个字符串的数组吗?如果是这样,您可能想要 std::array&lt;std::string, 5&gt; 而不是 C 风格的 std::string[5]
  • 还有一些东西绝对是错误的。 std::string key_letter_arr[5]; 然后访问 key_letter_arr[5] 是不正确的。 key_letter_arr 是一个由 5 个 std::string 对象组成的数组,key_letter_arr[5] 将是第六个这样的对象。我建议尝试在两次尝试编译之间编写更少的代码,并确保它按预期工作。
  • @NathanPierson 哦,是的,第二个可能是我的一些粗心,我还需要包含array 来做使用的事情吗?
  • 是的,如果你想使用std::array,你需要#include &lt;array&gt;
  • 在那条巨大的错误消息中,请注意main.cpp:46:54: required from here 行。它指向您的main.cpp 中的第 46 行。整个消息归结为你不能打电话给keyHashMap.emplace(char&amp;, string[5])

标签: c++ g++ using


【解决方案1】:

在 std::map 中使用 std::string[5] 作为类型时编译时出现 g++ 错误

数组不能存储为std::map 的元素。但是,您可以存储类,并且数组可以是类的成员。标准库为这种数组包装器提供了一个模板。它被称为std::array。您可以将其用作地图的元素。

旁注:std::map 并不是唯一有这种限制的标准容器。 std::array 是唯一可以自身包含数组作为元素的标准容器。

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 2015-05-08
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2011-06-23
    • 2012-05-15
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多