2014-09-27 60 views
0

我有一个提升字符串算法库的问题。 我试图分裂和标记化拆分/记号化wstring的,但我总是得到这个以下错误提升字符串算法错误

error C2664: 'std::_String_const_iterator<std::_String_val<std::_Simple_types<char>>>::_String_const_iterator 
(const std::_String_const_iterator<std::_String_val<std::_Simple_types<char>>> &)' : 
cannot convert argument 1 
from 'std::_String_const_iterator<std::_String_val<std::_Simple_types<wchar_t>>>' 
to 'const std::_String_const_iterator<std::_String_val<std::_Simple_types<char>>> &' 

我已经尝试过其他的代码

std::vector<std::wstring> tokenize(const std::wstring& input) { 
    std::vector<std::wstring> output; 
    boost::char_separator<wchar_t> sep(L";"); 
    boost::tokenizer<boost::char_separator<wchar_t>> tokens(input, sep); 
    std::for_each(tokens.begin(), tokens.end(), 
     [&output] (std::wstring ws) { 
      output.push_back(ws); 
     } 
    ); 
    return output; 
} 

错误消息意味着像boost::split或将wstring更改为字符串,但它不起作用。

这里有什么问题?

+0

重复http://stackoverflow.com/questions/1307883/error-c2664-converting-from-from-const-stdstring-to -stdstring – 2014-09-27 15:14:08

回答

2

综观tokenizer.hpp源,分词的定义是这样的:

template < 
    typename TokenizerFunc = char_delimiters_separator<char>, 
    typename Iterator = std::string::const_iterator, 
    typename Type = std::string 
    > 
    class tokenizer { 
    ... 

您只指定TokenizerFunc为类模板,但忘了指定IteratorType。其结果是,你得到了错误:cannot convert argument 1 ...wchar_t... to ...char...

为了使你的代码运行,则应指定的boost ::标记生成器的所有参数,例如:

typedef boost::tokenizer<boost::char_separator<wchar_t>, std::wstring::const_iterator, std::wstring > tokenizer; 

代码:

#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <boost/tokenizer.hpp> 

std::vector<std::wstring> tokenize(const std::wstring& input) { 
    std::vector<std::wstring> output; 

    typedef boost::tokenizer<boost::char_separator<wchar_t>, std::wstring::const_iterator, std::wstring > tokenizer; 
    boost::char_separator<wchar_t> sep(L";"); 
    tokenizer tokens(input, sep); 

    std::for_each(tokens.begin(), tokens.end(), 
    [&output] (std::wstring ws) { 
     output.push_back(ws); 
    } 
); 

    return output; 
} 

int main(int argc, char* argv[]) { 

    auto v = tokenize(L"one;two;three"); 
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::wstring, wchar_t>(std::wcout, L" ")); 

    return EXIT_SUCCESS; 
} 

输出:

one two three 
+0

我同意此处的分析。 – sehe 2014-09-28 20:31:33