2010-07-14 4 views
1

В следующем коде:Перегрузки оператора << для работы строки

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); работы.

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

EDIT: Я просто глупо ... забыл включить "строка" заголовок

Спасибо!

+0

Для форматирования кода, используйте кнопку 1010. – 2010-07-14 10:16:26

ответ

6

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

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

будет производить:

str1 
str2 

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

+1

Это уже оператор << перегрузка в . – Puppy

+0

Я глуп !!! Причина, по которой выше не работала, на самом деле забавная :) (подсказка: отсутствует) p.s. Извините за глупый вопрос:) – HotHead

2

Как уже указывал Дэвид, для строк уже есть 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 пространство имен не допускается для обычных пользователей, так как это может иметь специфические для реализации эффектов, которые непредсказуемы и могут сломаться все виды материала в стандартной библиотеке. Кроме того, нет никакой гарантии, что ваша реализация стандартной библиотеки имеет перегружаемый оператор < <. Это означает, что это может сработать, или это невозможно.

Смежные вопросы