2010-09-05 263 views
0

我有下面的代码来实现polynimial类实现polynimial类实现

#include <iostream> 
#include <cstdlib> 
using namespace std; 
template<class Number> 
class POLY 
{ 
public: 
    int n; 
    Number *a; 
public: 
    POLY<Number>(Number c,int N){ 

     a=new Number[N+1]; 
      n=N+1; 
      a[N]=c; 
      for (int i=0;i<N;i++) a[i]=0; 
       } 
    float eval(float x) const { 

     double t=0.0; 
      for (int i=n-1;i>=0;i--) 
       t=t*x+a[i]; 
      return t; 


    } 


    friend POLY operator+(POLY &p,POLY&q){ 
     friend POLY operator+(POLY &p,POLY&q){ 

POLY t(0,p.n>q.n?p.n-1:q.n-1); 
      for (int i=0;i<p.n;i++) 
t.a[i]+=p.a[i]; 
for (int j=0;j<q.n;j++) 
    t.a[j]+=q.a[j]; 

    return t; 

} 



    } 
    friend POLY operator+(POLY &p,POLY&q){ 



    } 

} 


int main(){ 






    return 0; 
} 

的ADT但以下pragment

friend POLY operator+(POLY &p,POLY&q){ 

POLY t(0,p.n>q.n?p.n-1:q.n-1); 
      for (int i=0;i<p.n;i++) 
t.a[i]+=p.a[i]; 
for (int j=0;j<q.n;j++) 
    t.a[j]+=q.a[j]; 

    return t; 

} 

节点的工作已经参照问题,请告诉我,什么是错的? 错误

1>------ Build started: Project: polynomial, Configuration: Debug Win32 ------ 
1>Build started 9/5/2010 6:00:34 PM. 
1>PrepareForBuild: 
1> Creating directory "c:\users\david\documents\visual studio 2010\Projects\polynomial\Debug\". 
1>InitializeBuildStatus: 
1> Creating "Debug\polynomial.unsuccessfulbuild" because "AlwaysCreate" was specified. 
1>ClCompile: 
1> polynomial.cpp 
1>c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(54): error C2143: syntax error : missing ';' before 'int' 
1>c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(29): error C2270: '+' : modifiers not allowed on nonmember functions 
1>   c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(54) : see reference to class template instantiation 'POLY<Number>' being compiled 
1>c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(45): error C2270: '+' : modifiers not allowed on nonmember functions 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:01.36 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

我已经更新代码

#include <iostream> 
#include <cstdlib> 
#include <ostream> 
using namespace std; 

template<class Number> 
class POLY 
{ 
public: 
    int n; 
    Number *a; 
public: 
    POLY(Number c,int N){ 
     a=new Number[N+1]; 
     n=N+1; 
     a[N]=c; 
     for (int i=0;i<N;i++) a[i]=0; 
    } 

    float eval(float x) const { 
     double t=0.0; 
     for (int i=n-1;i>=0;i--) 
      t=t*x+a[i]; 
     return t; 
    } 

    friend POLY operator+(POLY &p,POLY&q){ 

     POLY t(0,p.n>q.n?p.n-1:q.n-1); 
     for (int i=0;i<p.n;i++) 
      t.a[i]+=p.a[i]; 
     for (int j=0;j<q.n;j++) 
      t.a[j]+=q.a[j]; 
     return t; 
    } 
    friend POLY operator*(POLY &p,POLY & q){ 

     POLY t(0,(p.n-1)+(q.n-1)); 
       for (int i=0;i<p.n;i++) 
        for (int j=0;j<q.n;j++) 
          t.a[i+j]=p.a[i] * q.a[j]; 
       return t; 

    } 
}; 


int main(int argc,char *argv[]){ 
    float p=3.0f; 
    int n=10; 

    POLY<int> x(1, 1),one(1,0),t=x+one,y=t; 
    for (int i=0;i<n;i++) 
    { y=y*t; 
    cout<<y<<endl;} 
    cout<<y.eval(p)<<endl; 

    return 0; 
} 

错误是

>c:\users\david\documents\visual studio 2010\projects\polynomial1\polynomial1\polynomial.cpp(55): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'POLY<Number>' (or there is no acceptable conversion) 
1>   with 
1>   [ 
1>    Number=int 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(679): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(726): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(764): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(811): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(937): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(944): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(951): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(958): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(968): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,POLY<Number>>(std::basic_ostream<_Elem,_Traits> &&,_Ty)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char>, 
1>    Number=int, 
1>    _Ty=POLY<int> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(1085): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(186): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(192): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(199): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(206): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(226): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(260): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(280): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(305): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(325): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(345): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(366): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(386): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(407): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(427): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(447): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(467): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(487): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   while trying to match the argument list '(std::ostream, POLY<Number>)' 
1>   with 
1>   [ 
1>    Number=int 
1>   ] 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:00.82 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

你的代码是否完整?为什么时髦的缩进?为什么在你的课堂上有两个'operator +'EMPTY定义?为什么EMPTY主要?为什么'operator +'的操作数是非const? – paercebal 2010-09-05 14:56:17

+0

你有两个'op +'的定义?另外,你遇到了什么样的错误 - 编译时间,链接器或运行时间? – dirkgently 2010-09-05 14:57:43

+0

我会更新代码外观 – user439547 2010-09-05 14:58:20

回答

2

classstruct声明用 ';' 结尾。

#include <iostream> 
#include <cstdlib> 

using namespace std; 

template<class Number> 
class POLY 
{ 
public: 
    int n; 
    Number *a; 
public: 
    POLY(Number c,int N){ 
     a=new Number[N+1]; 
     n=N+1; 
     a[N]=c; 
     for (int i=0;i<N;i++) a[i]=0; 
    } 

    float eval(float x) const { 
     double t=0.0; 
     for (int i=n-1;i>=0;i--) 
      t=t*x+a[i]; 
     return t; 
    } 

    friend POLY operator+(POLY &p,POLY&q){ 

     POLY t(0,p.n>q.n?p.n-1:q.n-1); 
     for (int i=0;i<p.n;i++) 
      t.a[i]+=p.a[i]; 
     for (int j=0;j<q.n;j++) 
      t.a[j]+=q.a[j]; 
     return t; 
    } 
}; 


int main(){ 
    POLY<int> p(5, 2); 
    return 0; 
} 

以上是应该编译的代码的固定版本。虽然你的设计可以使用一些改进。几点建议:

  • 了解三巨头的规则(拷贝构造函数,拷贝赋值运算符和析构函数)
  • 不要用类模板开始(如果你只在C开头++编程)
  • 初始化列表
  • 这没关系using namespace std;在一个测试程序,但你必须知道的命名空间污染
  • 如果你做一个new你需要一个delete某处(和new ...[]需要delete [] ...)否则您会泄漏内存
  • 您的代码不使用iostreamcstdlib中的任何内容。为什么让他们呢?
  • 你并不需要两个for循环在你friend op+
+0

不,如果它帮助我使用visual C++ 2010并且错误是相同的,那么它是不固定的 – user439547 2010-09-05 15:13:16

+0

我发布的代码在VS2010和Comeau上编译得很好。你可以尝试将它复制粘贴到编辑器窗口并构建它吗? – dirkgently 2010-09-05 15:19:29

2

你在你的代码肯定有太多的operator+() defintions:

friend POLY operator+(POLY &p,POLY&q){ 
    friend POLY operator+(POLY &p,POLY&q){ 
     [...] 
    } 
} 
friend POLY operator+(POLY &p,POLY&q){ 

} 

显然,只能是其中之一。

“问题与引用”你可能提及意味着你应该const参考的参数时(和操作者本身也应该是const):

POLY operator+(const POLY &p, const POLY &q) const { 
    [...] 
} 
0

看来你错过了一个重载operator<<为你的聚类。你看,cout << y只是不奇迹般地工作。你必须确定这里应该发生什么。

一对夫妇的其他建议:

  • 使用const时,它是有道理的。例如,它对于operator+,operator*operator<<作为您的参考参数的cv限定符很有意义。
  • 由于您似乎在学习语言,因此了解如何编写复制构造函数,赋值运算符和析构函数(尊重rule of three)可能非常有益。但在实际的代码中,你可能只是使用一个向量作为成员,使得生活如此更容易,因为你几乎不需要做任何事情(w.r.t.定义你自己的特殊成员函数)。

例子:

template<class T> 
struct poly 
{ 
    std::vector<T> coeffs; 

    // default ctor 
    poly() {} 

    // conversion constructor (i.e. poly<int> --> poly<double> 
    template<class U> 
    poly(poly<U> const& p) 
    : coeffs(p.coeffs.begin(),p.coeffs.end()) {} 

    friend poly operator+(poly const& a, poly const& b) 
    { 
     ... 
    } 

    friend poly operator*(poly const& a, poly const& b) 
    { 
     ... 
    } 
}; 

template<class T> 
ostream& operator<<(ostream& os, poly<T> const& p) 
{ 
    .... 
    return os; 
} 

有!不需要自定义副本,赋值运算符或析构函数。