2012-02-20 4 views
2

Я работаю над проектом моделирования агентов и решил использовать для этого трассировку. Я предварительно установил кучу библиотек и загрузил источник Repast и попытался включить его в проект. Но вдруг получить ошибку, которую я не могу понять.Ошибка компиляции C++ (библиотека REPAST)

error: no match for ‘operator+’ in ‘std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator](((const char*)"_")) + boost::filesystem3::path::filename() const()’

КОД:

NCDataSet::NCDataSet(std::string file, const Schedule& schedule) : 
file_(file), schedule_(&schedule), start(0), open(true) 
{ 
    rank = RepastProcess::instance()->rank(); 
    if (rank == 0) { 
     fs::path filepath(file); 
     if (!fs::exists(filepath.parent_path())) { 
      fs::create_directories(filepath.parent_path()); 
     } else if (fs::exists(filepath)) { 
      string ts; 
      repast::timestamp2(ts); 
      fs::path to(filepath.parent_path()/(ts + "_" + filepath.filename())); 
     fs::rename(filepath, to); 
    } 
} 
} 
ERROR LINE: fs::path to(filepath.parent_path()/(ts + "_" + filepath.filename())); 

Спасибо !!!

+0

Это единственная ошибка? Если нет, можете ли вы опубликовать полный вывод компилятора? – hmjd

ответ

1

Ошибка указывает, что она не может соответствовать operator+, т. Е. Вы пытаетесь добавить два недопустимых типа.

Похоже, что path::filename не возвращает строку std ::.

class path { 
    // ... 
    path filename() const; 
    // ... 
}; 

Разумно думать о операторах инфикса как о сохранении типа левой стороны операции. В этом случае std::string ничего не знает о повышении или filesystem::path.

Таким образом, вы, вероятно, нужно изменить строку, вызвавшую к чему-то вроде этого:

fs::path to(filepath.parent_path()/(ts + "_" + filepath.filename().string())); 

я считаю, когда это не сразу видно, как связка встроенных операций вызывает ошибку, это хорошая практика отделить все на своей собственной линии. В этом случае он даже сделает код более понятным в отношении вашего намерения.

std::string old_filename(filepath.filename().string()); 
std::string new_filename = ts +"_"+ old_filename; 
fs::path to(filepath.parent_path()/new_filename); 
Смежные вопросы