c++ 不能将BOOST_STRONG_TYPEDEF与std::字符串一起使用

wnrlj8wa  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在使用Boost(v1.71)的强typedef来区分std::string,但我遇到了一些问题。

BOOST_STRONG_TYPEDEF(std::string, StrongString);

首先,我想将StrongStringunordered_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成员来修复编译器错误,但这不是正确的使用方法。

nukf8bse

nukf8bse1#

BOOST_STRONG_TYPEDEF宏的目的是生成一个类,该类 Package 基元类型的示例,并提供适当的转换运算符,以便使新类型可替换其 Package 的类型。
std::string不是基元类型。
可能的实现:

struct StrongString {
  StrongString(const std::string& s) : wrapped_(s) {}
  operator std::string&() { return wrapped_; }

 private:
  std::string wrapped_;
};

正如您所看到的,StrongString没有成员函数,因此s.length()+=不起作用,但以下代码可能起作用:std::size(s)s = std::string(s) + "c"中的至少一个。
没有为StrongString定义std::hash

相关问题