Проблемы с доступом к членам частного класса при перегрузке & lt; & lt; оператор

Я видел другие темы на эту тему, но они не смогли мне особенно помочь. Я создаю класс, который распечатывает в файл .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

Решение

friend объявление внутри класса помещает оператор в окружающее пространство имен (wilsonOutput). Предположительно, ваша реализация не находится в этом пространстве имен; в этом случае он объявляет отдельную перегрузку оператора в любом пространстве имен, в которое вы его поместили, и эта перегрузка не является другом класса.

Вам нужно указать пространство имен при его реализации:

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

Кстати, ставить плохую идею using в шапке; не каждый, кто включает заголовок, обязательно захочет, чтобы эти имена были сброшены в глобальное пространство имен.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]