C++ 为什么可以';我返回一个带有透明函子的法线贴图引用吗?

C++ 为什么可以';我返回一个带有透明函子的法线贴图引用吗?,c++,functor,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

此代码适用于:

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; }
该错误消息来自g++,但clang给了我一个类似的错误


为什么类型化函子可以,但透明函子不能编译?

问题是比较函数是
std::map
模板实例类型的一部分。
std::map
使用的比较函数的默认值是
std::less
。所以

std::map<uint64_t, std::shared_ptr<MyObj>, std::less<uint64_t>>
或者只需使用
auto
即可避免重复每个贴图的类型

class MyData {
public:
  const auto& get_normal() const { return _normal; }
  const auto& get_reverse() const { return _reverse; }

private:
  std::map<uint64_t, std::shared_ptr<MyObj>> _normal;
  std::map<uint64_t, std::shared_ptr<MyObj>, std::less<>> _reverse;
};
类MyData{
公众:
const auto&get_normal()const{return_normal;}
const auto&get_reverse()const{return_reverse;}
私人:
std::map_normal;
标准::映射_反转;
};

问题在于比较函数是
std::map
模板实例类型的一部分。
std::map
使用的比较函数的默认值是
std::less
。所以

std::map<uint64_t, std::shared_ptr<MyObj>, std::less<uint64_t>>
或者只需使用
auto
即可避免重复每个贴图的类型

class MyData {
public:
  const auto& get_normal() const { return _normal; }
  const auto& get_reverse() const { return _reverse; }

private:
  std::map<uint64_t, std::shared_ptr<MyObj>> _normal;
  std::map<uint64_t, std::shared_ptr<MyObj>, std::less<>> _reverse;
};
类MyData{
公众:
const auto&get_normal()const{return_normal;}
const auto&get_reverse()const{return_reverse;}
私人:
std::map_normal;
标准::映射_反转;
};

std::map
的默认比较器是
std::less

这意味着

std::map<uint64_t, T>

因此,它的顺序与
\u normal
std::map
的默认比较器是
std::less

这意味着

std::map<uint64_t, T>
因此它的顺序与
\u normal
相反

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