Перегрузочный оператор << для работы на строку - PullRequest
1 голос
/ 14 июля 2010

В следующем коде:

 using namespace std;

 //ostream& operator<< (ostream& out,const string & str)
 //{    
 //  out << str.c_str();    
 //  return out; 
 //}

 int _tmain(int argc, _TCHAR* argv[])
 {

     ofstream file("file.out");  

     vector<string> test(2); 

     test[0] = "str1"; 
     test[1] = "str2";
     ostream_iterator<string> sIt(file);

     copy(test.begin(), test.end(), sIt);

     file.close();
    return 0;
}

Как правильно перегрузить operator <<, чтобы заставить copy(test.begin(), test.end(), sIt); работать.

Чего мне не хватает?

РЕДАКТИРОВАТЬ: Я просто глупо ... забыл включить заголовок "строки"

Спасибо!

Ответы [ 3 ]

6 голосов
/ 14 июля 2010

Вам не нужно перегружать operator<< для работы со строками, он уже знает, как с ними обращаться.

std::copy( test.begin(), test.end(), 
           std::ostream_iterator<std::string>( file, "\n" ) );

выдаст:

str1
str2

Есть ли что-то другое?/ особенное, что вы хотите сделать там?

2 голосов
/ 14 июля 2010

Как уже указывал Дэвид, для строк уже есть operator<<, поэтому вам не нужно его указывать.Если вы действительно хотите определить свою собственную перегрузку в любом случае, тогда есть небольшая проблема, потому что на самом деле вам не разрешено это делать.operator<< определено в пространстве имен std, поэтому, если вы хотите использовать полезную перегрузку для std::string (версия в большинстве реализаций является функцией шаблона, поэтому является потенциальной перегрузкой),вам придется делать это и в пространстве имен std (из-за того, что неоднозначности и перегрузки разрешаются в C ++, здесь есть несколько предостережений).Например:

namespace std {
 ostream& operator<< (ostream& out,const string & str)
  {     
    out << "A STRINGY:" << str.c_str();     
    return out; 
  }
}

Однако добавление содержимого в пространство имен std недопустимо для обычных пользователей, поскольку оно может иметь специфические для реализации эффекты, которые непредсказуемы и могут нарушить все виды содержимого в стандартной библиотеке,Также нет гарантии, что ваша реализация стандартной библиотеки имеет перегружаемый оператор <<.Это означает, что это может работать или не может.</p>

1 голос
/ 14 июля 2010

Дай мне просто добавить ссылку с cplusplus.com для дальнейшего использования

http://www.cplusplus.com/reference/algorithm/copy/

...