【问题标题】:more than one operator ">>" matches these operands多个运算符“>>”匹配这些操作数
【发布时间】:2013-04-21 21:01:21
【问题描述】:

无论我在哪里使用带有字符串流的“>>”,它都会给我这个错误。我不明白为什么会出现这个错误,因为我只重载了 >> 以使用 AbsClass,而不是使用任何其他类型。

#include "Queue.h"
#include "AbsClass.h"
#include <fstream>
#include <iostream>
#include <iomanip>
#include <sstream>

using namespace std;


int main()
{
    ifstream read;
    try
    {
        read.open( "TopicGin.txt" );
        if (!read)
        throw QueueException();
    }
    catch ( QueueException& )
    {
        cerr << "Could not find input file.\n";
        char endchar = getchar();

        if(endchar == '\nn')
        return 0;
    }

    string line;

    getline( read, line );

    stringstream stream;

    stream << line;

    int buffer;

    Queue <int> q1;

    while ( stream >> buffer )
    {
        q1.enqueue( buffer );
        cout << buffer << ' ';
        cout << "count is ";
        q1.displayCount();

    }

    cout << q1.peek();

    q1.dequeue();

    cout << q1.peek();

    Queue<int> q2 = q1;

    q2.peek();

    cout << "\n The contents of q2 with queue size " << q2.getSize() << " are: \n"; 
    q2.displayArray();

    //NEED EXCEPTIONS FOR THIS PART JUST SEETING UP 
    cout << " Attempt to create a queue of int with an invalid size.\n";

    Queue<int> q3(-1);

    cout << "Create queue object of double q4 with a size of 14.\n";

    Queue<double> q4(14);

    cout << "Read in values from the input file. \n";

    stream.clear(); 

    double dBuf;

    getline ( read, line );

    stream << line;

    while ( stream >> dBuf )
    {
        q4.enqueue( dBuf );
        cout << dBuf << ' ';
        cout << "count is ";
        q4.displayCount();

    }

    cout << fixed << setprecision(2);
    cout << q4.peek();
    q4.dequeue();
    cout << q4.peek();

    cout << "Create Queue object of 5 which is a copy of q4\n";

    Queue<double> q5 = q4;

    q5.peek();

    q5.displayArray();


    //EXCEPTIONS AGAIN DLFKJALDKAJ

    cout << "Attempt to peek an empty queue. \n";
    Queue<double> q6;
    q6.peek();


    cout << "Create Queue object of AbsClass q7 with default size. \n";
    cout << "Read in values from input file \n";

    Queue<AbsClass> q7;

    cout << "Read in values from the input file. \n";

    AbsClass AbsBuf;

    getline ( read, line );

    stream.clear(); 

    stream << line;

    while ( stream >> AbsBuf)
    {
        q7.enqueue( AbsBuf );
        cout << AbsBuf   << ' ';
        cout << "count is ";
        q7.displayCount(); 0
    }
    return 0;
}

l

#include<iostream>
#include<cmath>
#include <string>
// JAMES: ADDED THIS:
#include <sstream>

using namespace std;

// JAMES: ADDED THIS:
stringstream& operator>>( stringstream& stream, AbsClass& obj );

class AbsClass
{
public:
    AbsClass(int val = 0){num = abs(val);} // Inlined constructor

    int getNum()const {return num;}

    // JAMES: ADDED THIS:
    void setNum( int newNum ) { num = abs(newNum ); } 

private:
    int num;
};

// JAMES: ADDED THIS:
stringstream& operator>>(stringstream& stream, AbsClass& obj)
{
  int buffer;
  stream >> buffer;

  obj.setNum( buffer );

  return stream;
}

k

#include "AbsClass.h"
#include <sstream>

using namespace std;


// JAMES: ADDED THIS:
istream& operator>>( istream& stream, AbsClass& obj );

istream& operator>>( istream& stream, AbsClass& obj )
{
    int buffer;
    stream >> buffer;
    obj.setNum( buffer );
    return stream;
}

【问题讨论】:

  • 一般来说,你会为std::istream &amp;重载它。

标签: c++ operator-overloading


【解决方案1】:

除了标头保护之外,您还需要创建 operator&gt;&gt; inline,或将实现移至 .cpp,否则您将收到多重定义的符号链接错误。
也不要use namespaces in headers

【讨论】:

  • 每个包含标头的 .cpp 都会定义它自己的操作符>>打破ODR
  • 当我在 AbsClass.cpp 中放入“运算符>>”时,主 cpp 文件显示“没有运算符“>>”与这些操作数匹配。我将 AbsClass.cpp 编辑到我的帖子中。
  • @JamesGold 您只需要移动定义,声明应保留在头文件中。
【解决方案2】:

改变这个

// JAMES: ADDED THIS:
stringstream& operator>>(stringstream& stream, AbsClass& obj)
{
  int buffer;
  stream >> buffer;

  obj.setNum( buffer );

  return stream;
}

到这里

// JAMES: ADDED THIS:
istream& operator>>(istream& stream, AbsClass& obj)
{
  int buffer;
  stream >> buffer;

  obj.setNum( buffer );

  return stream;
}

您不会为 istream 重载 stringstream 的 operator>>。然后它将适用于任何输入流,包括 stringstream。不完全确定这是否是问题的原因,但绝对是正确的做法。

【讨论】:

  • 它将与字符串流一起使用。如果您为 istream 重载,它将为 any 输入流、cinifstreamfstreamistringstreamstringstream,所有这些。
  • 好的。改成istream,问题依旧。
  • 您能否发布完整的错误消息。剪切并粘贴上面几行和下面几行。
【解决方案3】:

我忘记为AbsClass 添加标题保护。这样就解决了。

【讨论】:

  • 是的,我刚想说,但你也应该声明你的 operator>> inline,它在一个头文件中。 inline istream&amp; operator&gt;&gt;(istream&amp; stream, AbsClass&amp; obj) { ... 除非您将其声明为内联,否则您可能会出现“多重定义符号”链接器错误。
猜你喜欢
  • 2020-05-20
  • 1970-01-01
  • 2012-05-07
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多