c++ - 为什么我不能返回带有透明仿函数的法线贴图引用?

标签 c++ functor

此代码有效:

class MyObj {};

class MyData {
 public:
  using tMyMap = std::map<uint64_t, std::shared_ptr<MyObj>>;

  const tMyMap& get_normal() const;
  const tMyMap& get_reverse() const;

 private:
  std::map<uint64_t, std::shared_ptr<MyObj>> _normal;

  std::map<uint64_t, std::shared_ptr<MyObj>, std::less<uint64_t>> _reverse;
};

const MyData::tMyMap& get_normal() const { return _normal; }
const MyData::tMyMap& get_reverse() const { return _reverse; }

但 clang-tidy 建议我使用透明仿函数并更改 std::less<uint64_t>std::less<>在我的声明中 _reverse .不幸的是,当我这样做时,代码不再编译:

test_map.cpp: In member function ‘const tMyMap& MyData::get_reverse() const’:
test_map.cpp:20:60: error: invalid initialization of reference of type ‘const tMyMap& {aka const std::map<long unsigned int, std::shared_ptr<MyObj> >&}’ from expression of type ‘const std::map<long unsigned int, std::shared_ptr<MyObj>, std::less<void> >’
 const MyData::tMyMap& MyData::get_reverse() const { return _reverse; }

该错误消息来自 g++,但 clang 给了我一个类似的错误。

为什么有类型的仿函数可以,但透明的仿函数不能编译?

最佳答案

std::map的默认比较器是 std::less<KeyType> .

这意味着

std::map<uint64_t, T>

std::map<uint64_t, T, std::less<uint64_t>>

是同一类型,但是

std::map<uint64_t, T, std::less<>>

是不同的类型,因为 std::less<uint64_t>std::less<>是不同的类型。


如果_normal,你会看到同样的问题和 _reverse实际上是彼此相反的。我假设你实际上是想声明 _reverse作为

std::map<uint64_t, std::shared_ptr<MyObj>, std::greater<uint64_t>> _reverse;

所以它的顺序与_normal相反.

关于c++ - 为什么我不能返回带有透明仿函数的法线贴图引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52461422/

相关文章:

c++ - 使用 vector 的 merge_sort 适用于少于 9 个输入

C++ store functor 在类中

c++在给定类中创建函数指针 vector ,函数是不同类的成员

c++ - 如何通过引用或指针传递功能对象(仿函数)?

python - 如何在 Cython 中包装 C++ 仿函数

c++ - 如何解决调用 WNetAddConnection2 时出现的 ERROR_BAD_NET_NAME 错误?

c++ - 使用二进制搜索的模板递归

c++ - 可以提升asio post "overflow"队列

haskell - 仿函数实例声明中的箭头运算符?

c++ - Netbeans 讨厌 nullptr 但仍然工作正常