Я видел другие темы на эту тему, но они не смогли мне особенно помочь. Я создаю класс, который распечатывает в файл .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;
}
Любая помощь будет довольно … полезной.
friend
объявление внутри класса помещает оператор в окружающее пространство имен (wilsonOutput
). Предположительно, ваша реализация не находится в этом пространстве имен; в этом случае он объявляет отдельную перегрузку оператора в любом пространстве имен, в которое вы его поместили, и эта перегрузка не является другом класса.
Вам нужно указать пространство имен при его реализации:
ostream & wilsonOutput::operator<<(ostream &out, wilsonOutput::HTMLTable htmlTable)
{ // ^^^^^^^^^^^^^^
...
}
Кстати, ставить плохую идею using
в шапке; не каждый, кто включает заголовок, обязательно захочет, чтобы эти имена были сброшены в глобальное пространство имен.
Других решений пока нет …