重载<<<<<<<<<<<<操作者

时间:2012-09-14 10:07:32

标签: c++ operator-overloading ostream

我已经看到了关于这个主题的其他一些主题,但他们并没有能够特别好地帮助我。我正在创建一个打印到.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 个答案:

答案 0 :(得分:3)

类中的friend声明将运算符放在周围的命名空间(wilsonOutput)中。据推测,您的实现不在该命名空间中;在这种情况下,它会在您放入的任何名称空间中声明运算符的单独重载,并且该重载不是该类的朋友。

您需要在实现时指定命名空间:

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

顺便说一下,将using放在标题中是个坏主意;并非每个包含标题的人都希望将这些名称转储到全局名称空间中。