我有我的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 回答
您的复制构造函数应该引用
const
对象:或者更好,遵循Zero of Rule并且根本不要声明复制构造函数 .