2010-04-15 51 views
0

這裏是一類,我開始頭:簡單的語法錯誤還是逃避我

#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()的末尾是錯誤的,但這似乎是它所期望的。有人能爲我澄清嗎?

(另外,我知道很多的< <和>>操作定義看起來可怕,但除非是錯誤請不要解決這個問題的具體原因。這是一個草案:)代碼)

+0

杜佩http://stackoverflow.com/questions/2646592/error-expected-before-token-what-is-the-cause熱賣同一用戶一個小時之前。 @melee - 不要這樣做 - 如果您有額外的信息,請編輯您的原始問題。 – 2010-04-15 19:20:56

+0

你應該用任何新信息編輯你的舊問題,因爲這是相同的*問題*。 – GManNickG 2010-04-15 19:21:33

+0

對不起。我今天註冊了這個網站,並且不太確定導航,找不到我原來的帖子。希望這不是太麻煩。 – user317654 2010-04-15 19:24:24

回答

5

您錯過了標題中的istream& operator>>(istream& In, Canvas& One)}

數據成員int image[][100];也是無效的,因爲在ctor中是image[][100] = {};

您的實施(.cpp)文件應包括其相應的標頭第一個。這是確保標題獨立的簡單方法。在這種情況下,它會導致標準庫頭文件中的語法錯誤,這會很快指出問題出在頭上(因爲這是stdlib #includes之前的問題)。

2

您不必關閉}在操作結束>>

3

你缺少一個右}operator>>身體。此外,這是不正確的:

using namespace std; 
#include <iostream> 

該命令必須是相反的。 GCC的行爲不符合:std如果還沒有包含標準頭文件,則該文件不可見。因此,在下一個更符合標準的編譯器中,它可能會失敗。

此外,在標題中,你應該寫std::istream而不是隻有istreamostream等相同)。在你當前的代碼中,你的頭文件依賴於它的用戶在包含它之前有typen using namespace std;,從設計的角度來看這很醜陋,因爲它使頭文件以非明顯的方式依賴於它的用戶(通常,它應該相反)。

+0

這一次打敗你整整一分鐘,你很懶! – 2010-04-15 19:31:17

+0

@Roger,恥辱我! – 2010-04-15 19:37:31

0

其他人已經回答了你的問題,但這裏有幾個加分:

如果你的插入和提取運算符的定義不那麼模板,你應該將它們移動到您的實現文件,僅僅停留在聲明它們頭文件。這將允許您與線

#include <iosfwd> 

的IO的後者將只包含聲明流,而不是整個定義更換線

#include <iostream> 

。這反過來會轉化爲包含該頭部的每個編譯單元的更快的編譯時間。

另一方面,你也可以選擇在頭文件中保留這些函數,但要對它們進行模板化。

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

這會給你的,你現在有相同的增加編譯時間成本支持任何流的額外的靈活性。

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; 
}