映射和节点,错误智能感知:不存在从"const std::pair<const int, double>"到"Node"的合适用户定义转换

Map and Node, error IntelliSense: no suitable user-defined conversion from "const std::pair<const int, double>" to "Node" exists

本文关键字:const double gt 定义 转换 用户 int Node pair 智能 错误      更新时间:2023-10-16

我写这段代码是为了使用映射和节点读取和添加多项式。

错误发生在operator+中。我知道我没有将我的映射与Node相关的代码,我认为我应该在"std::map PolynomialMap"中使用一些东西;类似于列表,但我不确定是什么。或者我应该完全改变我的代码并使用另一种方法?如果不够好,请让我知道如何改进我的问题

#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <vector>
#include <map>
using namespace std;
typedef struct Node
{
    double  cof;      // coefficient 
    int     deg;      // degree
} Node;               // the node of polynomial
class CPolynomial
{
private:
    std::map<int, double> PolynomialMap;
public:
    CPolynomial();
    CPolynomial(const string& file);
    virtual ~CPolynomial();
    CPolynomial operator+(const CPolynomial &right);
    CPolynomial& operator=(const CPolynomial &right);
private:
    void AddOneTerm(Node term);   // add one term into m_Polynomial 
};
int main()
{
    CPolynomial p1("P3.txt");
    CPolynomial p2("P4.txt");
    CPolynomial p3;
    p3 = p1 + p2;
    return 0;
}
CPolynomial::CPolynomial()
{
    ;
}
CPolynomial::CPolynomial(const string& file)
{
    Node term;
    fstream MyFile;
    string p;
    int num;
    MyFile.open(file);
    if (!MyFile.is_open())
    {
        cerr << "Unable to open input file" << endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        MyFile >> p >> num;
        map <int, double>::iterator it = PolynomialMap.begin();
        for (int i = 0; i < num; i++)
        {
            MyFile >> term.deg >> term.cof;
            AddOneTerm(term);
        }
        MyFile.close();
    }
}

CPolynomial CPolynomial:: operator+(const CPolynomial &right)
{
    CPolynomial temp_polynomial;
    temp_polynomial.PolynomialMap = PolynomialMap;
    map <int, double> ::const_iterator it; it = right.PolynomialMap.begin();
    for (; it != right.PolynomialMap.end(); ++it) //
    {
        AddOneTerm(*it); //error C2664: 'void CPolynomial::AddOneTerm(Node)' : cannot convert argument 1 from 'const std::pair<const _Kty,_Ty>' to 'Node'
                          //IntelliSense: no suitable user-defined conversion from "const std::pair<const int, double>" to "Node" exists
    }
    map <int, double> sum_result = PolynomialMap;
    PolynomialMap = temp_polynomial.PolynomialMap;
    temp_polynomial.PolynomialMap = sum_result;
    sum_result.clear();
    return temp_polynomial;
}
CPolynomial& CPolynomial:: operator=(const CPolynomial &right)
{
    this->PolynomialMap = right.PolynomialMap;
    return *this;
}
void CPolynomial::AddOneTerm(Node term)
{
    auto it = PolynomialMap.begin();
    while (it != PolynomialMap.end() && it->first < term.deg)
    {
        ++it;
    }
    if (it != PolynomialMap.end() && term.deg == it->first)
    {
        it->second += term.cof;
    }
    else
    {
        PolynomialMap.insert(pair<int, double>(term.deg, term.cof));
    }
}
CPolynomial::~CPolynomial()
{
    PolynomialMap.clear();
}

问题是,您已经编写了AddOneTerm方法,以期望一个参数是Node结构,但在operator+方法中,您正试图向它传递一个参数,即const std::pair<const int, double>

有多种方法可以解决这个问题。以下代码通过在Node类中提供一个构造函数来修改代码以解决问题,该构造函数可以将const std::pair<const int, double>转换为Node。还需要添加无参数构造函数,因为在通过读取文件构造多项式时,您使用的是Node的隐式无参数构造函数。

typedef struct Node
{
    double  cof;      // coefficient
    int     deg;      // degree
    Node()
    {
         deg = 0;
         cof = 0.0;
    }
    Node(const pair<const int, double> & nodePair)
    {
        deg = nodePair.first;
        cof = nodePair.second;
    }
} Node;               // the node of polynomial