Сионист писал(а):Не открывается.
Скажу прямо, пробовал хреново. Какой же ты программист, если не можешь найти в папке компилятора место, где расположен системный хедер и открыть его? Хорошо, я подскажу тебе, в MinGW стандартные С++ хедеры действительно упрятаны в нелогичное место, например у меня они лежат вот тут:
\MinGW\lib\gcc\mingw32\4.8.1\include\c++\
Но их нестандартное расположение не отменяет необходимость наличия у программиста (да что там, даже у обычного пользователя) умения производить поиск файлов на жёстком диске.
И так, теперь мы открываем файл ostream и смотрим, как объявлен оператор вывода для сишных строк:
Код: Выделить всё
template<typename _CharT, typename _Traits>
inline basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
Там рядом есть ещё группа внешних операторов для других типов.
Для std::string ищем оператор в хедере, где объявлен сам класс std::string. Там он тоже внешний.
Думаю, продолжать не стоит.
А теперь вернёмся к нашей изначальной проблеме. Как заставить работать указанный код? Достаточно сделать твои операторы внешними. И всех делов-то.
Код: Выделить всё
#include <iostream>
#include <fstream>
class TMyStream : public std::ofstream { };
TMyStream& operator << (TMyStream& os, const char* String)
{
(std::ofstream&)os << "Specific narrow string operator: " << String;
return os;
}
TMyStream& operator << (TMyStream& os, const wchar_t* String)
{
(std::ofstream&)os << "Specific wide string operator: " << String;
return os;
}
int main()
{
TMyStream stream;
stream.open("D:\\Temp\\temp.txt");
stream << "Test" << std::endl;
stream << L"Test" << std::endl;
return 0;
}
Обрати внимание на конструкцию (std::ofstream&)os. Такое приведение обязательно для тестового примера. Если его уберёшь, то оператор начнёт в цикле вызывать себя бесконечное количество раз.
Как видишь, манипуляторы прекрасно работают и никакие костыли с оператором, принимающим указатель на функцию, не нужны.