首页 文章

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

提问于
浏览
-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 :: Polynome(Polynome)'Polynome.cpp:32:19:注意:候选者是:包含在Polynome.cpp中的文件:1:0 :Polynome.hpp:30:9:注意:Polynome :: Polynome(std :: set>)[with T = int] Polynome(const set <pair> s){^ Polynome.hpp:30:9:注意:否参数1的已知转换从'Polynome'到'std :: set,std :: less>,std :: allocator>'Polynome.hpp:24:9:注意:Polynome :: Polynome(const T *)[with T = int] Polynome(const T arrayOfT []){^ Polynome.hpp:24:9:注意:参数1从'Polynome'到'const int *'没有已知的转换'Polynome.hpp:20:9:注意:Polynome :: Polynome(Polynome&)[含T = int] Polynome(Polynome&pol):_ coef(pol.coef){^ Polynome.hpp:20:9:注意:参数1从'Polynome'到'Polynome&'没有已知的转换Polynome.hpp:16:9:注意:Polynome :: Polynome()[with T = int] Polynome(): cook(){^ Polynome.hpp:16:9:注意:候选人需要0个参数,1提供Polynome . HPP:37:25 :error:初始化'std :: ostream&operator <<的参数2(std :: ostream&,Polynome)'friend ostream&operator <<(ostream&os,Polynome pol){

这与我的主要内容有关:cout << 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,std :: allocator >> :: iterator {aka std :: _ Rb_tree_iterator>}'和'std :: map,std :: allocator >> :: const_iterator {aka 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>&)struct _Rb_tree_iterator ^ / usr / include / c /4.9/bits/stl_tree.h:172:12:注意:参数1没有已知的转换从'std :: map,std :: allocator> :: const_iterator {aka std :: _ Rb_tree_const_iterator>}'到'const std :: _ Rb_tree_iterator>&'/ usr / include / c /4.9/bits/stl_tre呃: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:注意:没有已知的从'std :: map,std :: allocator >> :: const_iterator {aka std :: _ Rb_tree_const_iterator>}'转换为'std :: _ Rb_tree_iterator> &&'在Polynome.cpp中包含的文件:1 :0:Polynome.hpp:86:78:错误:将'const Polynome'作为'T&Polynome :: operator [with T = int]'的'this'参数传递'丢弃限定符[-fpermissive] pair newPair = pair(it- >首先,它 - >第二个p [it-> first]);

为什么?

1 回答

  • 1

    您的复制构造函数应该引用 const 对象:

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

    或者更好,遵循Zero of Rule并且根本不要声明复制构造函数 .

相关问题