VS2015无法从“初始化列表”转换为“std :: string”错误

时间:2016-12-09 08:34:57

标签: c++ string visual-studio-2013 visual-studio-2015 stdstring

// get the drive letter/network volume portion of the path
    std::string drive_path;
    if (drive_type == disk_util::drive_type_network)
    {
        boost::iterator_range<std::string::const_iterator> r = boost::find_nth(path, "/", 3);
        if (!r.empty())
            drive_path = std::string(path.begin(), r.begin());
    }
    else
    {
        size_t i = path.find('/');
        drive_path = path.substr(0, i);
    }


//path is also a std::string type 

问题来自: drive_path = std :: string(path.begin(),r.begin());

这是在VS2013上成功编译,但它在VS 2015中引发了错误 错误:错误C2440:'':无法从'初始化列表'转换为'std :: string'

根据std :: string构造函数,我们有一个Range构造函数,它使用iterator1和iterator 2来填充字符串。

http://www.cplusplus.com/reference/string/string/string/

    //range (7) 
template <class InputIterator>
  string  (InputIterator first, InputIterator last);

在VS2013中,它现在显示出一些潜在问题的警告并成功编译。

两个迭代器都是相同的字符串,我不知道为什么这在VS2015中失败了。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

string ctor要求两个迭代器具有相同的类型class InputIterator。您的path.begin()std::string::iteratorr.begin()std::string::const_iterator

我要试一试(制作两个const)

drive_path = std::string(path.cbegin(), r.begin());

或(使两者都成为非常)

boost::iterator_range<std::string::iterator> r;

答案 1 :(得分:1)

Iterator参数应与您使用的字符串构造函数的类型相同 我怀疑你传递的是一个“非const”迭代器(path.begin())作为第一个参数,一个const_iterator作为第二个参数。

您可以尝试传递两个const_iterators(使用string :: cbegin()):

drive_path = std::string(path.cbegin(), r.begin());