Я пытаюсь передать строковый аргумент функции из основной функции, а затем передать полученный строковый аргумент конструктору ifstream. Я могу получить эту строку в функции, но когда я передаю этот аргумент ifstream, я получаю сообщение об ошибке:
нет соответствующей функции для вызова ‘std :: basic_ifstream :: basic_ifstream (const string &)’ std :: ifstream file (имя_файла);
Вот мой код:
int** read_CSV(std::string const& fileName)
{
//cout<<fileName<<"\n";//this works
std::ifstream file(fileName);//problem
//Rest of logic
}
Основная функция:
int main()
{
int** inputMatrix1 = read_CSV("inputData4_80-20_100x32.csv");
return 0;
}
Переменная fileName создает проблему. Если я передам его как есть, он выдаст ошибку. Но вместо этого, если я явно укажу имя файла, используя строку, а не переменную, код будет работать нормально. Может кто-нибудь объяснить, в чем именно проблема и как я могу ее решить?
Обратитесь к std::basic_ifstream::basic_ifstream: конкретный конструктор, который вам нужен, был добавлен в C++ 11, поэтому вам нужен компилятор, совместимый с C++ 11 (и запускайте его в режиме C++ 11)
@Someprogrammerdude Сейчас я использую GCC версии 5.4.0
До C++ 11 было необходимо выполнить std::ifstream file(fileName.c_str()), поскольку у std::ifstream не было конструктора, который принимал std::string в качестве аргумента. Начиная с C++ 11, std::ifstream имеет конструктор, который принимает std::string в качестве первого аргумента, поэтому ваш код будет работать.
Тогда ваш код должен работать, поскольку в серии 5 GCC по умолчанию включен C++ 11. Пожалуйста, попробуйте создать Минимальный, полный и проверяемый пример, чтобы показать нам. И скопируйте и вставьте выходные данные ошибок полный и полный этого MCVE.
@Someprogrammerdude Вы уверены, что gcc 5.x по умолчанию включает C++ 11? Я думаю, что это началось с gcc 6. Это не компилируется в godbolt (godbolt.org/g/W1bXTA) с gcc 5.4 без -std=c++11.
@Peter, использующий c_str, решил проблему.
@archity Вам, вероятно, потребуется скомпилировать с -std=c++11, чтобы включить поддержку C++ 11 (который включает перегруженный конструктор для std::ifstream).
@Holt Да, мне придется явно использовать слоган C++ 11, чтобы использовать его с g ++.
@Holt Ладно, это было недоразумение с моей стороны. Серия 5 по умолчанию не использует C++ 11, но по-прежнему старый -std=gnu++98. Таким образом, правильным решением для OP было бы не использование c_str(), а добавление флага -std=c++11 (или, возможно, -std=gnu++11, если требуются расширения GCC).
@Peter Вы можете указать c_str как ответ на вопрос, объясняя также компиляцию C++ 11.





Итак, проблема заключалась в том, что я пытался скомпилировать без стандарта C++ 11, используя только g ++ "NameOfFile.cpp". В разделе комментариев есть два возможных решения проблемы:
g++ -std=c++11 "NameOfFile.cpp"c_str() в конце строкового объекта, поскольку ifstream не принимает строки в качестве аргумента до C++ 11, поэтому c_str() используется для явного преобразования в совместимый формат. .Вот измененная строка кода для второго решения:
std::ifstream file(fileName.c_str());
Спасибо @Peter и @Holt за их вклад.
Какую версию GCC вы используете? В версиях до 5 (которые к настоящему времени довольно старые) вам необходимо явно включить режим C++ 11.