我正在使用Boost(v1.71)的强typedef来区分std::string
,但我遇到了一些问题。
BOOST_STRONG_TYPEDEF(std::string, StrongString);
首先,我想将StrongString
与unordered_map
一起使用,但是当我重载哈希时:
std::unordered_map<StrongString, int, std::hash<StrongString>> umap;
我收到编译器错误:
/usr/include/c++/11/bits/hashtable_policy.h:1126:7: error: use of deleted function ‘std::hash<StrongString>::~hash()’
第二,之前我使用字符串连接并调用string::length()
:
std::string s;
s += "c";
s.length();
然而,当我现在这样做的时候:
StrongString s;
s += "c";
s.length();
我得到:
error: no match for ‘operator+=’ (operand types are ‘StrongString’ and ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’})
error: StrongString has no member named ‘length’
我可以通过使用s.t
访问Boost Strong Typedef的内部t
成员来修复编译器错误,但这不是正确的使用方法。
1条答案
按热度按时间nukf8bse1#
BOOST_STRONG_TYPEDEF
宏的目的是生成一个类,该类 Package 基元类型的示例,并提供适当的转换运算符,以便使新类型可替换其 Package 的类型。std::string
不是基元类型。可能的实现:
正如您所看到的,
StrongString
没有成员函数,因此s.length()
和+=
不起作用,但以下代码可能起作用:std::size(s)
和s = std::string(s) + "c"
中的至少一个。没有为
StrongString
定义std::hash
。