2013-04-15 31 views
3

我试图让boost::string_ref工作,我想,但我面临一个问题,现在 - 下面的代码无法编译:如何比较的boost :: string_ref到的std :: string

#include <boost/utility/string_ref.hpp> 
#include <iostream> 
#include <string> 

using namespace std; 

int main() { 
    string test = "test"; 
    boost::string_ref rtest(test); 
    cout << (rtest == "test")<<endl; 
} 

与海合会抛出30KB错误日志,从

source.cpp: In function 'int main()': 
source.cpp:10:19: error: no match for 'operator==' (operand types are 'boost::string_ref {aka boost::basic_string_ref<char, std::char_traits<char> >}' and 'const char [5]') 
    cout << (rtest == "test")<<endl; 
       ^

如何比较boost::string_refstd::string

+0

你可以包含日志到第一个完整的'error'行吗? –

+0

@DrewDormann http://liveworkspace.org/code/2dWWjs$0 – mfontanini

回答

5

老实说,我只是完全避免使用string_ref,直到它成熟。事实上,无法比较string_refstd::stringconst char *开箱即用的事实应该使闹铃响起(看起来他们忘了写一堆比较运算符),更糟糕的是,它看起来不像库收到足够的测试(例如bug 8067!)。

+6

看起来像即将出现的[Boost 1.54](http:// www。 boost.org/users/history/version_1_54_0.html)将解决这个问题,它应该使'boost :: string_ref'变得更强大e很有用。 –

+0

'string_ref'在Boost 1.60中已经很成熟,开箱即可进行比较。至于使用'string_ref'检查[this](http://www.boost.org/doc/libs/1_60_0/libs/utility/doc/html/string_ref.html#string_ref.examples)的理由。 – rustyx

1

只需在字符串中输入string_ref即可。它们构建起来非常便宜。尽管针对字符串文字,您可能需要包含长度。否则,它将迭代一次以查找字符串的结尾,然后再次迭代以比较它们。只要确保如果更改了字符串,就可以使计数保持最新。

cout << (rtest == boost::string_ref("test",4)) << endl; 

随着std::string,你不需要担心计数,因为string_ref只会调用size()成员函数,这也很便宜。

+1

我看不出原始比较如何编译失败。已经为'string_refs'定义了一个相等运算符,并且'string_ref'构造函数使用了'charT *',但显然编译器并没有选择它,因为模板参数扣除失败。你知道为什么会这样吗?顺便说一句,我没有downvote。 “ – mfontanini

+4

”*虽然对于字符串文字,您可能需要包含长度。*“哇,这很伤心。字符串文字是'const char [N]';提供的大小。有*没有理由*为什么'string_ref'不应该有一个模板构造函数的大小。 –

+2

@NicolBolas:它仍然需要搜索空终止符。一个'const char [N]'可以保存一个C字符串,该字符串在'N'之前的任何一点终止。 –

相关问题