【问题标题】:operators << , >> overloading fail for a particular class特定类的运算符 << , >> 重载失败
【发布时间】:2013-11-02 21:00:31
【问题描述】:
istream &operator>>(istream &in, iString &a) {
        string name;
        in>>name;
        iString b(name);
        delete a.chars;
        a=b;
        return in;
}
ostream &operator<<(ostream &out, const iString &a) {
        out<<a.chars<<endl;
        return out;
}

这些是我为结构编写的运算符:

struct iString{
  char * chars;
  unsigned int length;
  unsigned int capacity;

  iString();
  iString(const char *);
  iString(const iString&);
  ~iString();

  iString &operator=(const iString&);
  };

// Add other declarations here:
iString operator+(const iString &a, const iString &b);
iString operator*(const iString &a, unsigned int scalar);
iString operator*(unsigned int scalar, const iString &a);
ostream &operator<<(ostream &out, const iString &b);
istream &operator>>(istream &in, iString &b);

我得到的部分错误:

error: no match for ‘operator>>’ in ‘std::cin >> * a[(((int)which) + -0x00000000000000061)]’
/usr/include/c++/4.4/istream:119: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:123: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:130: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:166: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:170: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:173: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:177: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:180: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>

我在客户端模块(主)中使用结构的部分方式:

switch(c) {
      case 'r':
        cin >> which;  // Reads a, b, c, or d
        a[which-'a'] = new iString;
        cin >> *(a[which-'a']);
        break;
      case 'w':
        cin >> which;  // Reads a, b, c, or d
        cout << *(a[which-'a']) << endl;
        break;
      case 'n':
        cin >> which >> temp;
        a[which-'a'] = new iString(temp.c_str());
        break;
      case 'i':
        cin >> op1 >> op2;
        a[op1-'a'] =

注意:字段 chars 是指分配的向量堆

客户端模块(主)中的变量定义:

int main() {
  bool done = false;
  string temp;
  iString *a[4];
  while(!done) {
    char c;
    char which;
    char op1;
    char op2;
    int int_op;
    cerr << "Command?" << endl;  // Valid commands:  r [a-d] string
                                 //                  wa, wb, wc, wd, q
                                 //                  s[a-d][a-d][a-d]
                                 //                  t [a-d] [a-d] string
                                 //                  m [a-d] int [a-d]
                                 //                  p [a-d] [a-d] int
                                 //                  n [a-d] string
                                 //                  i [a-d] [a-d]
                                 //                  = [a-d] [a-d]
                                 //                  f [a-d] 
                                 //                  e [a-d]
                                 //                  l [a-d]
    cin >> c;  // Reads r, p, m, s, w, n, i, e, f, q
    if (cin.eof()) break;

我将这个定义用于赋值运算符:

iString& iString::operator=(const iString &b) {
        chars=new char[strlen(b.chars)+1];
        strcpy(chars, b.chars);
        length=capacity=b.length;
        return *this;
}

改为删除 [] ... ;删除数组并将“使用命名空间std”放入包含类定义的文件中的正确语法,我得到了新错误: 在 istring.cc:3 中包含的文件中:

istring.h:21: error: expected constructor, destructor, or type conversion before ‘&’ token
istring.h:22: error: expected constructor, destructor, or type conversion before ‘&’ token
istring.cc: In function ‘std::istream& operator>>(std::istream&, iString&)’:
istring.cc:59: error: no matching function for call to ‘iString::iString(std::string&)’
istring.cc:19: note: candidates are: iString::iString(const iString&)
istring.cc:11: note:                 iString::iString(const char*)
istring.cc:7: note:                 iString::iString()
istring.h:21: error: expected constructor, destructor, or type conversion before ‘&’ token
istring.h:22: error: expected constructor, destructor, or type conversion before ‘&’ token

【问题讨论】:

  • 添加你的变量声明,我猜aiString **a 或类似的东西。
  • delete a.chars; a=b; 如果有必要,delete 应该在iString 的赋值运算符中完成
  • @shooting-squirrel *(a[which-'a']) 看起来很奇怪。
  • delete a.chars; 是用new[] 分配的chars?那么它应该是delete[]。实际上,整个delete 应该是不必要的,除非你的operator= 很无聊。
  • 我拿走了你的代码,修复了在operator &gt;&gt; 中从string(你没有合适的构造函数)创建iString,用iString *a[4]; cin &gt;&gt; *a[0]; 写了一个main,它编译得很好。超载工作。您可能还有另一个编译器错误,不是吗?

标签: c++ class overloading


【解决方案1】:

你应该试试;

cout << a[which-'a'] << endl;
cin >> a[which-'a'];

【讨论】:

  • 我明白你的意思,但我不应该将 iString 对象的引用传递给
【解决方案2】:

这是您的问题:您正试图调用带有参数name 的构造函数,该参数是std::string。您声明了三个构造函数,但没有一个采用 std::string

    string name;
    in>>name;
    iString b(name);

如果您尝试了以下操作,就像您在代码的其他地方使用的一样,会怎样?

    iString b(name.c_str());  // use iString(const char *);

另外,如果你明确表示你想要一个整数来索引你的指针数组呢?

    cin >> which;  // Reads a, b, c, or d
    int index = which - 'a';           // explicitly create an int
    assert(0 <= index && index < 4);   // should probably do some checking of input
    a[index] = new iString;
    cin >> *(a[index]);
    break;

这将使您的代码更清晰,并避免在编译器错误中显示该偏移量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多