与功能中的'operator=='不匹配

No match for 'operator==' in function

本文关键字:功能 不匹配 operator      更新时间:2023-10-16

我正在进行一个caesar解密项目,在CaesarDecipher函数中,我在编译时不断收到这个错误

错误:'textInit.std::basic_string<中的'operator=='不匹配_CharT,_Traits,>_Alloc>::运算符[][其中_CharT=char,_Traits=std::char_Traits,_Alloc>=std:::分配器](((长无符号int)i))==字母[j]'

这是该功能的代码:

string CipherMessage::CaesarDecipher(string key)
{
  int keyValue;
  int charValue;
  string textInit = m_text;
  string textFinal;
  // Initializes an array containing the alphabet. A=index 0, B=index 1, etc
  string alphabet[26] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","
O","P","Q","R","S","T","U","V","W","X","Y","Z"};
  for (int i=0; i<=25; i++){
    if (alphabet[i] == key)
      keyValue = i;
  }
for (int i=0; i<=textInit.length(); i++){
    for (int j=0; j<=25; j++){
      if (textInit[i] == alphabet[j])   // Error occurs here
        charValue = j;
    }
    charValue = (charValue+keyValue)%26;
    for (int j=0; j<=25; j++){
      if (charValue == j)
        textFinal += alphabet[j];
    }
  }
  cout << "Final " << textFinal << endl;
  return textFinal;
}

有人能帮忙吗?

您可能打算像一样声明alphabet

string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

以清除此错误消息。

正如在一条注释中所提到的,您声明了一个由26个完整的string组成的数组,但从textInit[i]进行索引实际上会返回一个char类型(而不能合理地将其与std::string进行比较)。

该错误意味着您正在尝试比较两种不同的类型,但没有为这两种类型定义相等运算符。

你特别提到这条线路有故障:

if (textInit[i] == alphabet[j])

textInit的类型和字母表的类型是什么?查看您的申报:

// textInit is a string
string textInit = m_text;
// alphabet is an array of strings
string alphabet[26] ={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","
O","P","Q","R","S","T","U","V","W","X","Y","Z"}; 

textInit这样的字符串进行索引会返回字符&(字符引用)。索引到字符串数组中(如字母表)会返回字符串

因此,当您将textInit[i]与alphabet[j]进行比较时,您试图将字符串与char&进行比较;。没有定义的方法来比较两者,因此程序无法编译。

正如其他人所提到的,一个快速解决方案是将字母表声明更改为:

// note that single quotes ('') are used for characters while double quotes "" are used for strings
char alphabet[26] ={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

现在字母表是一个字符数组,索引到字母表中会返回一个字符。所以这条线:

if (textInit[i] == alphabet[j])

现在可以了,因为你正在比较一个char和一个char&,并且类型是兼容的。

错误的原因是类型textInit[i]和alphabet[j]不匹配。您可以将字符串字母[26]更改为字符字母[26]。

这些其他答案确实解决了您的问题,但有一个不同的解决方案:您可以使用char类型的性质在恒定时间内进行检查,而不是在字母表上迭代。字符只是整数,(给定大小写的)字母保证连续有序。所以你可以用这个来代替第一个循环:

if (textInit[i] >= 'A' && textInit[i] <= 'Z') {
    charValue = textInit[i] - 'A';
}

第二个循环也是不必要的。它可以是这样的:

textFinal += (charValue + 'A');