2012-09-14 57 views
1

我已經看到關於此主題的其他一些線索,但他們無法很好地幫助我。我正在創建一個打印到.html文件的類。我宣稱ostream是朋友,但它仍然無法訪問課程的私人成員。在超載<<運算符時獲得對私人班級成員的訪問權限

我.h文件中

#ifndef OUTPUTTOHTML_H 
    #define OUTPUTTOHTML_H 
    #include <iostream> 
    #include <string> 
    #include <vector> 
    using std::string; 
    using std::vector; 
    using std::ostream; 

    namespace wilsonOutput 
    { 
    class HTMLTable 
    { 
     private: 
     vector<string> headers; 
     vector<vector<string> > rows; 
     //helper method for writing an HTML row in a table 
     void writeRow(ostream &out, string tag, vector<string> row); 

     public: 
     // Set headers for the table columns 
     void setHeaders(const vector<string> &headers); 
     // Add rows to the table 
     void addRow(const vector<string> &row); 
     //write the table innto HTML form onto an output stream 
     friend ostream & operator<<(ostream & out, HTMLTable htmlTable); 
    }; 
    } 

    #endif 

,這就是我在我的main.cpp中(而不是在主代碼塊)來實現過載。

// Overloaded stram output operator << 
    ostream & operator<<(ostream &out, wilsonOutput::HTMLTable htmlTable) 
    { 
     out << "<table border = \"1\">\n"; 
     // Write the headers 
     htmlTable.writeRow(out, "th", htmlTable.headers); 
     // Write the rows of the table 
     for (unsigned int r = 0; r < htmlTable.rows.size(); r++) 
     { 
      htmlTable.writeRow(out, "td", htmlTable.rows[r]); 
     } 
     // Write end tag for table 
     out << "</table>\n"; 
     return out; 
    } 

任何幫助將是相當有益的。

+1

您是否在main.cpp中指定了命名空間名稱? – MarsRover

+0

這個問題已經得到解答,但我可能會指出,按值傳遞'wilsonOutput :: HTMLTable'並不遵循通常的約定(通過const引用傳遞它),並且可能嚴重效率低下。 –

+0

您正在打印對象的副本。考慮使用'const wilsonOutput :: HtmlTable&htmlTable' – PiotrNycz

回答

3

該類中的friend聲明將運算符置於周圍名稱空間(wilsonOutput)中。據推測,您的實施不在該名稱空間中;在這種情況下,它會在您所使用的任何名稱空間中聲明一個單獨的運算符重載,並且該重載不是該類的一個朋友。

你需要指定命名空間,當你實現它:

ostream & wilsonOutput::operator<<(ostream &out, wilsonOutput::HTMLTable htmlTable) 
{  // ^^^^^^^^^^^^^^ 
    ... 
} 

順便說一句,這是一個壞主意,把using在頭;不是每個包含頭文件的人都需要將這些名稱轉儲到全局名稱空間中。

+0

謝謝。完美的作品,我覺得是這樣的。 – user1671033

相關問題