вопрос об указателях и перегрузке (.append () не работает в одной строке) - PullRequest
2 голосов
/ 27 июля 2011

В моей программе я хотел бы манипулировать элементами boost :: filesystem :: path вектора в цикле for.

typedef vector<fs::path> path_vec;
path_vec pv;

for (auto it = pv.cbegin(), end = pv.cend(); it != end; ++it)

Что я хотел бы сделать, это добавить строку в конецпути.

Если я делаю так, он работает нормально:

stringstream image_file_0001;
image_file_0001 << it->string() << "/x_alpha0001.png";
p1 = image_file_0001.str();

Если я так делаю, он тоже работает нормально:

string a = it->string();
string b = a.append("/prx");

Но если я попытаюсь сделать это в одну строку

string c = it->string().append("/prx");

или

string d = (it->string()).append("/prx");

, это выдаст ошибки компиляции:

7 перегрузок не имеют легального преобразованиядля указателя 'this'

Я думаю, это должно быть мое отсутствие знаний о том, как использовать указатели, или это как-то связано с функцией boost :: filesystem :: path .string ()?

Хорошо, я хотел бы создать каталог с "/prx", добавленным к пути origianl в *it. Могу ли я сделать это в одну строку?

boost::filesystem::createdirectory ( something here );

Проблема, по-моему, в том, что я не понимаю, почему .append () изменит исходную строку.Разве это не функция, которая возвращает другую строку, которую я могу свободно использовать, просто читая исходную строку?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

fs::path.string() возвращает const и поэтому вы ничего не можете добавить к нему, сначала вам нужно сделать копию

но зачем ты вообще это делаешь? есть очевидный способ добавить вложенный путь:

path / nested_path

EDIT:

typedef vector<fs::path> path_vec;
path_vec pv;

for (auto it = pv.begin(), end = pv.end(); it != end; ++it)
    *it /= "prx";

или для создания каталогов вместо изменения векторных значений замените последнюю строку на:

fs::create_directory(*it / "prx");
0 голосов
/ 27 июля 2011

it->string() вероятно постоянна.Почему бы вам не сказать:

const std::string a = it->string() + "/prx";
...