【问题标题】:No operator found which takes a left-hand operand of type c++未找到采用 c++ 类型左操作数的运算符
【发布时间】:2018-10-12 09:33:22
【问题描述】:

需要帮助找出以下源代码的问题所在。我有一个类来计算多个字符并将每个字符显示到控制台屏幕中。

但不幸的是,当我尝试编译时,我一直收到此错误消息

错误 C2678: 二进制 '>>' : 未找到采用 'std::istream' 类型的左侧操作数的运算符(或没有可接受的转换)

以下是源文件:

CharacterCounter.h

 #include <iostream>

 class CharacterCounter {
    public: 
      int fTotalNumberOfCharacters;
      int fCharacterCounts[256];  // hold all 256 byte values 

    public: 
      CharacterCounter();
      void count(unsigned char aCharacter);
      friend std::ostream& operator<<(std::ostream& aOStream, CharacterCounter& aCharacterCounter); 
    };

   }

CharacterCounter.cpp

    #include "CharacterCounter.h"
    #include <iostream>

    /// Constructor 
    CharacterCounter::CharacterCounter() {
      fTotalNumberOfCharacters = 0;
      for (int i=0; i < 256; i++) {
          fCharacterCounts[i] = i;
      } 
    }

    /// Counts the corresponding data member 
    void CharacterCounter::count(unsigned char aCharacter) {
      fTotalNumberOfCharacters++;
      fCharacterCounts[aCharacter]++;
    }

    /// Output stream displays characters greater than 0 
    std::ostream& operator<<(std::ostream& aOStream, const CharacterCounter& aCharacterCounter) {
      for (int i=0; i < 256; i++) {
        if (aCharacterCounter.fCharacterCounts[i] > 0) {
          int character = aCharacterCounter.fCharacterCounts[i]; 
          aOStream << (unsigned char)i << ":\t" << character << "\n"; 
        }
      } 

      return aOStream;
    }

Main.cpp

    #include <iostream>
    #include <string>
    #include "CharacterCounter.h"

    using namespace std; 

    int main() {

      CharacterCounter counter; 
      unsigned char character;

    while (cin >> counter) { **Compilation error focuses here**
       counter.count(character);
    }

    cout << counter; 
    system("pause");

    return 0;
   };

【问题讨论】:

  • 你有operator&lt;&lt;,而不是operator&gt;&gt;
  • CharacterCounter 的参数应该是const
  • 您正在为类定义operator &lt;&lt;(输出),但在main 中使用&gt;&gt;(输入)。你能解释一下为什么你认为这应该有效吗?或者你真的打算写while (cin &gt;&gt; character)而不是while (cin &gt;&gt; counter)
  • 顺便说一句,您对fCharacterCounts 的初始化可能不正确。我假设您希望所有元素都为?使用std::fillstd::fill_n 甚至std::memset 来“清除”数组。
  • 如果你只想输出,那么overload只需要operator&lt;&lt;。如果您只想输入,则仅重载operator&gt;&gt;。如果你想要输出和输入,都重载。没有任何规则或“标准说必须同时实现两者。

标签: c++ visual-c++ iostream


【解决方案1】:

你需要为你的CharacterCounter重载运算符&gt;&gt;,因为cin &gt;&gt; counter,声明它:

class CharacterCounter {
    public: 
//...
      friend std::istream& operator>>(std::istream& input, CharacterCounter& aCharacterCounter);
//...

然后声明函数重载:

std::istream &operator>>( std::istream  &input, CharacterCounter& aCharacterCounter ) 
{ 
    input >> aCharacterCounter. fTotalNumberOfCharacters;
    // Or input something else or more
    return input;            
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2018-08-13
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多