2015-02-12 2 views
8

Я пытаюсь копировать слова из одного файла в другой в CPP, вот мой код:Копирование слов из одного файла в другой в CPP

int main() 
{ 

    string from, to; 

    cin >> from >> to; 

    ifstream ifs(from); 

    ofstream ofs(to); 

    set<string> words(istream_iterator<string>(ifs), istream_iterator<string>()); 
    copy(words.begin(), words.end(), ostream_iterator<string>(ofs, "\n")); 

    return !ifs.eof() || !ofs; 
} 

таким образом, я получаю ошибку компиляции:

expression must have class type 

на линии, где я называю копию()

Если изменить конструкцию итераторы на следующее работает:

set<string> words{ istream_iterator<string>{ ifs }, istream_iterator<string>{} }; 

Я думал, что выбирать между() и {}, когда инициализация объектов в cpp является вопросом выбора, но я думаю, что я ошибаюсь. Может кто-нибудь объяснить это мне?

+0

На самом деле 'установить слова (istream_iterator {}, IFS istream_iterator {});' достаточно – Slava

ответ

2

В первом фрагменте коды set<string> words(istream_iterator<string>(ifs), istream_iterator<string>()) линии обрабатывается как объявление функции words, которая имеет два параметра: istream_iterator<string> ifs и безымянный параметр типа istream_iterator<string> и возвращает set<string>. Вот почему это дает ошибку компиляции. Второй не может быть проанализирован как объявление функции, поэтому он работает правильно.

+0

Почему 'istream_iterator (IFS)' проанализирован как тип? – Slava

+0

@Slava. Все выражение может быть проанализировано как объявление функции с двумя параметрами ('istream_iterator ifs' и' istream_iterator ) ', и это именно то, что происходит. Зачем? Хорошо, потому что стандарт C++ так говорит (хотя в этом контексте это не имеет особого смысла). – kraskevich

+0

'istream_iterator (ifs)' не следует анализировать как параметр, то есть проблема – Slava

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