用参数类重新定义二元运算符+

问题描述 投票:0回答:1

我有我的 Polynome 类,但是当我想重新定义 + 运算符时遇到一些问题。

#ifndef __POLYNOME_HPP__
#define __POLYNOME_HPP__

#include <iostream>
#include <map>
#include <set>
#include <math.h>
using namespace std;

template<class T>
class Polynome {

    private :
        map<int, T> _coef;
    public :
        Polynome<T>(): _coef() {

        }

        Polynome<T>(Polynome<T>& pol):_coef(pol._coef) {

        }

        Polynome<T>(const T arrayOfT[]) {
            for(int i = 0; i < sizeof(arrayOfT)/sizeof(arrayOfT[0]); i++) {
                _coef.insert(pair<int, T>(i, arrayOfT[i]));
            }
        }

        Polynome<T>(const set< pair<int, T> > s) {
            typename set< pair<int,T> >::iterator it;
            for(it = s.begin(); it!=s.end(); ++it) {
                _coef.insert(*it);
            }
        }

        friend ostream& operator<<(ostream& os, Polynome pol) {
            typename map<int,T>::iterator it;
            for (it=pol._coef.begin(); it!=pol._coef.end(); ++it) {
                if(it->first != 0) {
                    os << it->second << "x^" << it->first << " + ";
                }
            }
            os << " 0 " << endl;
            return os;
        }

        T evaluation(int x) {
            T result =0;

            typename map<int, T>::iterator it;

            for(it = _coef.begin(); it != _coef.end(); ++it) {


                result += pow(it->second, it->first) * x;

            }
            return result;
        }

        T& operator[](int indice) {
            return _coef[indice];
        }

        Polynome<T> derivatative() const {
            Polynome derivativePol;

            typename map<int, T>::iterator it;
            for(it = _coef.begin(); it != _coef.end(); ++it) {
                if(it->frist >= 1) {
                    pair<int, T> derivativePair = pair<int, T>(it->first - 1, it->first * it->second);
                    derivativePol.insert(derivativePair);
                }
            }

            return derivativePol;
        }

        friend Polynome<T> operator+(Polynome<T>& p, Polynome<T>& p2) {
            Polynome<T> pResult(p);
            typename map<int, T>::iterator it;
            for(it = p._coef.begin(); it != p._coef.end(); ++it) {

                pair<int, T> newPair = pair<int, T>(it->first, it->second + p2[it->first]);
                pResult._coef.insert(newPair);

            }

            return pResult;
        }
};
#endif

编译器给我以下错误:

Polynome.cpp:32:19:错误:没有匹配的函数可调用 ‘多项组::多项组(多项组)’

Polynome.cpp:32:19:注意:候选者是:包含在文件中 Polynome.cpp:1:0: Polynome.hpp:30:9: 注意: Polynome::Polynome(std::set >) [其中 T = int] 多项式(const set< pair > s) { ^ Polynome.hpp:30:9:注意:参数 1 没有从“Polynome”到“std::set”的已知转换, std::less>,std::分配器>

’ Polynome.hpp:24:9:注意:Polynome::Polynome(const T*) [其中 T = int] 多项式(const T arrayOfT[]) { ^ Polynome.hpp:24:9:注意:参数 1 没有从“Polynome”到“const int*”的已知转换 Polynome.hpp:20:9:注意: Polynome::Polynome(Polynome&) [其中 T = int] 多项式(多项式& pol):_coef(pol._coef) { ^ Polynome.hpp:20:9:注意:参数 1 没有从“Polynome”到“Polynome&”的已知转换 Polynome.hpp:16:9:注意: Polynome::Polynome() [其中 T = int] 多项式(): _coef() { ^ Polynome.hpp:16:9:注意:候选者需要 0 个参数,提供 1 个 Polynome.hpp:37:25:错误:初始化参数 2 ‘std::ostream& 运算符<<(std::ostream&, Polynome)’ friend ostream& operator<<(ostream& os, Polynome pol) {

这与我的主要内容中的这一行相关: 计算<< pol + pol2 << endl;

问题出在哪里?

编辑 1:我更改了操作员 + 签名,但它不再起作用。 我有:

friend Polynome<T> operator+(const Polynome<T>& p,const Polynome<T>& p2) {
            Polynome<T> pResult(p);
            typename map<int, T>::iterator it;
            for(it = p2._coef.begin(); it != p2._coef.end(); ++it) {


                pair<int, T> newPair = pair<int, T>(it->first, it->second + p[it->first]);
                pResult._coef.insert(newPair);

            }

            return pResult;
        }

但是编译器回答了这个:

Polynome.hpp:在‘Polynome 运算符+(const Polynome&, const Polynome&)’:Polynome.cpp:32:19:必需 从这里 Polynome.hpp:83:20: 错误:与“operator=”不匹配(操作数 类型是‘std::map > >::iterator {aka std::_Rb_tree_iterator >}’ 和 ‘std::map > >::const_iterator {又名 std::_Rb_tree_const_iterator >}’) for(it = p2._coef.begin(); it!= p2._coef.end(); ++it) { ^ Polynome.hpp:83:20:注意:候选者是:在 /usr/include/c++/4.9/map:60:0 包含的文件中, 来自 Polynome.hpp:5, 来自 Polynome.cpp:1: /usr/include/c++/4.9/bits/stl_tree.h:172:12: 注意: std::_Rb_tree_iterator >& std::_Rb_tree_iterator >::operator=(const std::_Rb_tree_iterator >&) 结构体_Rb_tree_iterator ^ /usr/include/c++/4.9/bits/stl_tree.h:172:12:注意:参数 1 从‘std::map >

没有已知的转换

::const_iterator {又名 std::_Rb_tree_const_iterator >}’ 到 ‘const std::_Rb_tree_iterator >&’ /usr/include/c++/4.9/bits/stl_tree.h:172:12: 注意: std::_Rb_tree_iterator >& std::_Rb_tree_iterator ::operator=(std::_Rb_tree_iterator >&&) /usr/include/c++/4.9/bits/stl_tree.h:172:12:注意:未知 参数 1 从 ‘std::map > >::const_iterator {aka std::_Rb_tree_const_iterator >}’ 到 ‘std::_Rb_tree_iterator >&&’ 在文件中 包含在 Polynome.cpp:1:0: Polynome.hpp:86:78: 错误:通过 “const Polynome”作为“T&”的“this”参数 Polynome::operator [with T = int]’ 丢弃限定符 [-f宽容] 对 newPair = 对(it->第一个, it->第二个 + p[it->第一个]);

为什么?

c++ c++11
1个回答
1
投票

您的复制构造函数应该引用

const
对象:

Polynome(const Polynome<T>& pol):_coef(pol._coef) {

    }

或者更好的是,遵循零规则并且根本不声明复制构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.