перегрузка оператора +, конкатенация
нужно выполнить конкатенацию 2 путей к папкам. У меня получается бесконечная рекурсия в строке с return:
#include <iostream>
#include <filesystem>
#include <string>
namespace fs = std::filesystem;
std::string operator+(const fs::path &set_folder, const fs::path &user_path) {
return set_folder + user_path;
}
int main() {
const fs::path user_path = "C:\\Users\\ys\17";
fs::path set_folder;
std::cout << "введите set_folder :";
std::cin >> set_folder;
fs::path res;
res = user_path + set_folder;
std::cout << res;
return 0;
}
Ответы (1 шт):
Вы определили сложение путей через сложение путей. Рекурсия. Если определить через сложение строк, то рекурсии не будет:
std::string operator +(const fs::path &set_folder, const fs::path &user_path) {
return set_folder.string() + user_path.string();
}
Ещё одна вещь. Программист вызывая c = a + b преполагает что у c, a и b одинаковый тип. В вашем случае это не так. Этот вариант более привычен:
fs::path operator +(const fs::path &set_folder, const fs::path &user_path) {
return set_folder.native() + user_path.native();
}
В примере выше мне подсказали что native лучше string.
Тоже самое можно сделать не переходя к строкам. Тут я специально передал первый аргумент как копию, чтобы изменить его в функции:
fs::path operator +(fs::path set_folder, const fs::path &user_path) {
set_folder += user_path;
return set_folder;
}
И ещё одна вещь. fs::path поддерживает оператор / который объединяет пути. В отличие от простой конкатенации он добавляет разделитель, если это нужно. Обычно это нужно:
fs::path operator +(const fs::path &set_folder, const fs::path &user_path) {
return set_folder / user_path;
}
Если вас устраивает как работает /, то оператор + не нужен:
// было res = user_path + set_folder;
// стало
res = user_path / set_folder;