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;