странные ошибки компиляции iostream - PullRequest
2 голосов
/ 19 марта 2011

Я получаю эти ошибки при попытке сделать следующее. У меня есть класс FileMgr для обработки входного и выходного файла с двумя функциями-членами, чтобы скопировать каждую строку ввода в список и записать в вывод каждого члена списка. примечание: следующие функции работают должным образом, когда обрабатываются непосредственно моим main! так что не пытайтесь разобраться, что я делаю с функциями копирования, я потратил много времени на их выяснение, и теперь они работают нормально, проблема не в этом.

    FileMgr::FileMgr(string inFilename, string outFilename)
{
    input.open(inFilename);
    output.open(outFilename);
}

bool FileMgr::writeFileToList(list<string> &l)
{
    // copy each line of file into new member of list<string>
    if(!input.is_open())
        return false;

    copy(istream_iterator<string>(input), istream_iterator<string>(), back_inserter(l));

    return true;
}

bool FileMgr::writeListToFile(list<string>::iterator begin, list<string>::iterator end)
{
    // copy each member of list<string> in output file, beginning and ending at iterators begin, end
    // note that I have to pass a "false" end iterator, that is, end--, for it to work
    if(!output.is_open())
        return false;

    copy(begin, end, ostream_iterator<string>(output, "\n"));

    return true;
}

и до сих пор все в порядке. затем мой другой класс, который получает список из FileMgr, и он должен позволить пользователю редактировать его (я еще не там из-за этих ошибок), так что вот часть моего объявления:

class Dictionary
{
public:
    Dictionary(string inFileName = "dictionary.txt", string outFileName = "output.txt");
    void userEditor();
//private:
    list<string> dictionary;
    FileMgr manager;
    bool findWord(string word);
    bool addWord(string word);
    bool deleteWord(string word);
    void sortAndFix();
    void saveAndExit();

и вот мои определения до сих пор, которые в основном являются просто конструктором:

    Dictionary::Dictionary(string inFileName, string outFileName)
{
    // open files and copy to list; sort and fix list.
    manager = FileMgr(inFileName, outFileName);

    dictionary.push_back(" ");
    if( manager.writeFileToList(dictionary) )
        cout << "File successfully read from " << inFileName << endl;
    else
        cout << "Error in reading " << inFileName << endl;

    sortAndFix();
}

при компиляции я получаю эти ошибки где-то неизвестно в только что показанном конструкторе (потому что это единственный код в файле, из которого я получаю эти ошибки при компиляции):

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(860): error 

C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(177) : see declaration of 'std::basic_ios<_Elem,_Traits>::operator ='
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator =(const std::basic_istream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(604): error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(177) : see declaration of 'std::basic_ios<_Elem,_Traits>::operator ='
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator =(const std::basic_ostream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]

Я не могу понять, что не так. мой FileMgr работает нормально при тестировании с моего основного, так почему компилятор так отключается при работе с FileMgr из другого класса ??

Ответы [ 4 ]

2 голосов
/ 19 марта 2011

Я считаю, что ваша проблема в этой строке:

manager = FileMgr(inFileName, outFileName);

Из вашего кода в FileMgr кажется, что FileMgr имеет поток input в качестве члена данных.Когда вы выполните вышеуказанную строку, вы вызовете оператор присваивания для FileMgr, который по умолчанию попытается скопировать все элементы данных по одному за раз.Однако функции копирования для потоков недоступны (они помечены private и не реализованы).Ошибки, которые вы получаете, почти наверняка связаны с тем, что компилятор C ++ замечает, что ему нужно копировать потоки, но не делает этого, потому что функции копирования недоступны.

Чтобы изменить это, попробуйте инициализировать managerв списке инициализатора члена конструктора:

Dictionary::Dictionary(string inFileName, string outFileName) 
    : manager(inFileName, outFileName) {
    /* ... */
}

Это будет инициализировать manager с заданными параметрами, а не пытаться назначить manager объект с правильными параметрами.

Надеюсь, это поможет!

1 голос
/ 19 марта 2011

Просто напишите:

if( manager.writeFileToList(dictionary) );

& не требуется. На самом деле это вызывает ошибку!

Кстати, ваш std::copy написан неправильно. Вот правильный:

copy(istream_iterator<string>(input), istream_iterator<string>(), std::back_inserter(l));

Обратите внимание на последний аргумент. Это std::back_inserter(l).

1 голос
/ 19 марта 2011
bool FileMgr::writeFileToList(list<string> &l);

FileMgr::writeFileToList получает аргумент типа list<string> по ссылке.

Таким образом, вы должны сделать -

list<string> dictionary;
if( manager.writeFileToList(&dictionary) )
                            ^ error. You should not use & symbol here.

Тип аргумента не list<string>*l дляотправить адрес.

0 голосов
/ 19 марта 2011

if( manager.writeFileToList(&dictionary) ) следует изменить на

if( manager.writeFileToList(dictionary) )

Обратите внимание, что вы не можете преобразовать Type* в Type&

...