2012-02-20 170 views
2

我正在开发代理建模项目,并决定使用该工具。 我已经预先安装了一堆库,并下载了重新启动源,并试图将其包含在项目中。但突然出现我无法理解的错误。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()’

CODE:

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 2012-02-20 22:03:17

回答

1

该错误表明它不能匹配operator+,即你试图附加两个无效类型。

它看起来像path::filename不会返回一个std :: string。

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);