Почему ifstream/ofstream не работает без функции c_str()?

По сути, у меня есть 2 постоянные строковые переменные с именами текстовых файлов ввода/вывода и 2 функции, которые принимают эти строки в качестве параметра. Одна функция предназначена для чтения 1-го файла, а другая — для записи во 2-й файл.

Константы:

const string duom = "U2.txt";
const string rez = "rez.txt";

Одна из функций:

void fileWrite(const string fn,int kieknuvaziavo,int kiekpristate,string paskutinis)
{
ofstream fout(fn.c_str());
fout << kiekpristate << " " << kieknuvaziavo << " " << paskutinis;
fout.close();
}

Если бы я удалил .c_str() из этой строки ofstream fout(fn.c_str());, я бы получил эту ошибку:

no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(const string&)'|

Вот часть основной функции:

int main()
{
    int kiekpristate = 0;
    int kieknuvaziavo = 0;
    string paskutinis;
    fileWrite(rez,kieknuvaziavo,kiekpristate,paskutinis);
    return 0;
}

Теперь, если бы я выбрал другой маршрут и вместо того, чтобы использовать параметры для пути к текстовому файлу, сам написал бы его в потоке, например так: ofstream fout("rez.txt"); Это сработало бы отлично. Мой вопрос: зачем мне нужна функция c_str() всякий раз, когда я использую параметры функции для передачи этой переменной? Что делает эта функция? Разве fn не равно "rez.txt"?


person Arkadijus    schedule 06.03.2017    source источник
comment
Возможно, обман: stackoverflow .com/questions/32332/. Обратите внимание, что "some text" не является string. Это строка в стиле c, которая представляет собой просто массив символов,   -  person NathanOliver    schedule 06.03.2017
comment
Перегрузки для конструкторов std::ifstream/std::ofstream, которые принимают std::string, были добавлены в стандарт C++11 (ранее они принимали только char*). Вы компилируете с включенными функциями С++ 11?   -  person Algirdas Preidžius    schedule 06.03.2017
comment
Я понятия не имею, включены ли функции С++ 11, как я могу проверить?   -  person Arkadijus    schedule 06.03.2017
comment
@Arkadijus Зависит от вашего компилятора. Вы не указали такую ​​информацию в самом вопросе. Если вы используете g++, вы можете скомпилировать его с помощью C++11, используя аргумент командной строки -std=c++11.   -  person Algirdas Preidžius    schedule 06.03.2017
comment
Я использую CodeBlocks с компилятором GNU GCC.   -  person Arkadijus    schedule 06.03.2017
comment
Версия компилятора @Arkadius GCC?   -  person πάντα ῥεῖ    schedule 06.03.2017
comment
Где я могу проверить?   -  person Arkadijus    schedule 06.03.2017
comment
@Arkadijus В вашей командной строке: gcc --version.   -  person πάντα ῥεῖ    schedule 06.03.2017
comment
«gcc» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.   -  person Arkadijus    schedule 06.03.2017
comment
Добавьте -v в настройки/компилятор/настройки компилятора/другие параметры компилятора. Запустите сборку. Версия есть где-то там в логе, найди.   -  person n. 1.8e9-where's-my-share m.    schedule 06.03.2017
comment
@Arkadijus - В общем, всегда знайте, какие инструменты и версии инструментов вы используете для создания своих программ. Просто не компилируйте вслепую и не знаете, что вы используете для выполнения этой работы.   -  person PaulMcKenzie    schedule 06.03.2017
comment
Я действительно не понимаю, какое отношение мой компилятор имеет к этому вопросу. Почему я должен использовать функцию c_str()? Почему ofstream fout("rez.txt") не равно ofstream fout(fn), где fn равно "rez.txt". Я не понял, что мне там пытался сказать Натан Оливер, я только начинаю изучать C++   -  person Arkadijus    schedule 06.03.2017
comment
@н.м. Пробовал строить с -v и без него, журналы остаются абсолютно одинаковыми.   -  person Arkadijus    schedule 06.03.2017
comment
@Arkadijus - Codeblocks должен знать, где находится gcc. Перейдите в свои настройки Codeblocks / Setup / Whatever и посмотрите, какую командную строку он использует для запуска компилятора. CodeBlocks не является компилятором, он запускает компилятор, установленный на вашем компьютере, и ему необходимо знать полный путь запуска gcc.exe.   -  person PaulMcKenzie    schedule 06.03.2017
comment
«gcc» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. Google выдает достаточно результатов по этому запросу, миру не нужен еще один хит.   -  person n. 1.8e9-where's-my-share m.    schedule 06.03.2017
comment
Я думаю, это версия 4.9.2.   -  person Arkadijus    schedule 06.03.2017
comment
@PaulMcKenzie code::blocks достаточно хорошо скрывает путь. Нужно знать, где искать.   -  person n. 1.8e9-where's-my-share m.    schedule 06.03.2017
comment
Итак, я знаю свою версию компилятора, что дальше?   -  person Arkadijus    schedule 06.03.2017
comment
Вы либо выбрасываете его и устанавливаете новейшую версию mingw (6.x.y), либо оставляете текущую и добавляете -std=c++11 в параметры компилятора. Пробовал строить с -v и без него, журналы остаются совершенно одинаковыми --- это вообще не может быть правдой в этой вселенной. Вы, вероятно, смотрите не на журнал сборки, а на сообщения сборки (сюрприз, две разные вещи),   -  person n. 1.8e9-where's-my-share m.    schedule 06.03.2017
comment
Я почти уверен, что смотрел в правильном месте, но это неважно. Теперь, когда я вставил эту строку, она работает без функции c_str(). Должен ли я забыть об этом сейчас или продолжать использовать его? Каковы шансы, что когда я буду сдавать экзамен по программированию, у проверяющего будет включена эта штука?   -  person Arkadijus    schedule 06.03.2017