简单的语法错误仍然无法解决

时间:2010-04-15 19:18:35

标签: c++ syntax

以下是我开始上课的标题:

#ifndef CANVAS_
#define CANVAS_

#include <iostream>
#include <iomanip>
#include <string>
#include <stack>

class Canvas
{
  public:

  Canvas();
  void Paint(int R, int C, char Color);
  const int Nrow;
  const int Ncol;
  string Title;
  int image[][100];
  stack<int> path;
  struct PixelCoordinates
   {
    unsigned int r;
    unsigned int c;
   } position;
   Canvas operator<< (const Canvas& One );
  Canvas operator>>( Canvas& One );
};

/*-----------------------------------------------------------------------------
   Name:      operator<<
   Purpose:   Put a Canvas into an output stream
-----------------------------------------------------------------------------*/
ostream& operator<<( ostream& Out, const Canvas& One )
{
  Out << One.Title << endl;
  Out << "Rows: " << One.Nrow << "    Columns: " << One.Ncol << endl;
   int i,j;
   for( i=0; i<One.Nrow; i++)
   {
     cout<<"\n\n\n";
     cout<< " COLUMN\n";
     cout<< " 1 2 3";
     for(i=0;i<One.Nrow;i++)
     {
       cout<<"\nROW "<<i+1;
          for(j=0;j<One.Ncol;j++) cout<< One.image[i][j];
     }
   }

  return Out;
}

/*-----------------------------------------------------------------------------
   Name:      operator>>
   Purpose:   Get a Canvas from an input stream
-----------------------------------------------------------------------------*/

istream& operator>>( istream& In, Canvas& One )
{
//  string Line;
//  int Place = 0;

//  {
//    In >> Line;

//    if (In.good())
//    {
//      One.image[Place][0] = Line;
//      Place++;
//    }
//  return In;

#endif

这是我的Canvas类的实现文件:

using namespace std;
#include <iostream>
#include <iomanip>
#include <string>
#include <stack>
#include "proj05.canvas.h"

//----------------Constructor----------------//

Canvas::Canvas()
{
  Title = "";
  Nrow = 0;
  Ncol = 0;
  image[][100] = {};
  position.r = 0;
  position.c = 0;
}

//-------------------Paint------------------//
void Canvas::Paint(int R, int C, char Color)
{
  cout << "Paint to be implemented" << endl;
}

我得到的错误是:

proj05.canvas.cpp: In function 'std::istream& operator>>(std::istream&, Canvas&)':
proj05.canvas.cpp:11: error: expected `;' before '{' token
proj05.canvas.cpp:24: error: expected `}' at end of input

从我有限的经验来看,它们看起来像是简单的语法错误,但对于我的生活,我看不出我错过了什么。我知道放一个;在Canvas :: Canvas()的最后是错误的,但这似乎是它所期望的。有人可以为我澄清一下吗?

(另外,我知道&lt;&lt;&gt;&gt;运算符定义的代码看起来很糟糕,但除非这是错误的具体原因,请不要解决它。这是草稿:) )

5 个答案:

答案 0 :(得分:5)

标题中的}遗漏了istream& operator>>( istream& In, Canvas& One )

数据成员int image[][100];也无效,ctor中的image[][100] = {};也是如此。

您的实现(.cpp)文件应首先#include其对应的标题 。这是确保标头自包含的简单方法。在这种情况下,它会导致标准库头中的语法错误,这会很快向您指出问题出在标题中(因为这是stdlib #includes之前的内容)。

答案 1 :(得分:3)

您错过了}正文的结束operator>>。此外,这是不正确的:

using namespace std;
#include <iostream>

订单必须是另一种方式。 GCC的行为不符合要求:如果尚未包含标准标头,则std必须不可见。所以在下一个更符合要求的编译器上,它可能会很难实现。

此外,在标题中,您应该写std::istream而不是istreamostream相同,等等)。在您当前的代码中,您的标头依赖于其用户在包含它之前具有typen using namespace std;,从设计的角度来看这非常难看,因为它使得标头以非显而易见的方式依赖于其用户(通常,它应该是相反的方式)。

答案 2 :(得分:2)

您在运营商&gt;&gt;

的末尾没有结束}

答案 3 :(得分:0)

其他人已经回答了你的问题,但这里还有几点:

如果你的插入和提取操作符的定义没有模板化,那么你应该将它们移动到你的实现文件中,只是在头文件中声明它们。这将允许您替换行

#include <iostream>

#include <iosfwd>

后者只包含IO流的声明,而不是整个定义。这反过来将转化为包含该标题的每个编译单元的更快编译时间。

另一方面,你也可以选择将这些功能保留在头文件中,但要对它们进行模板化。

template <typename Ch,typename Tr>
std::basic_istream<Ch,Tr>& std::operator>>(std::basic_istream<Ch,Tr>& in,
                                           Canvas& o)
{
    // ...
}

这将为您提供额外的灵活性,支持任何流,但代价是您现在拥有的编译时间相同。

答案 4 :(得分:0)

初始化类的常量成员的方式也有错误。

您必须使用初始化列表

Canvas::Canvas()
: Nrow(0), Ncol(0)
{
  Title = "";
  //Nrow = 0; - this is an attempt to change the value of a const, which was already constructed.
  //Ncol = 0; - same as above
  //image[][100] = {};
  position.r = 0;
  position.c = 0;
}