微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 std::map 中使用 std::less 无法编译

如何解决在 std::map 中使用 std::less 无法编译

我无法理解为什么下面的函数不能编译

#include <iostream>
#include <map>

int main(){
  std::map<int,int,std::less<int>> myMap(std::less<int>());
  myMap[2] = 2;
  std::cout << myMap[2] << std::endl;
  return 0;
}

错误信息如下-

std_less_check.cpp: In function ‘int main()’:
std_less_check.cpp:6:10: warning: pointer to a function used in arithmetic [-Wpointer-arith]
   myMap[2] = 2;
          ^
std_less_check.cpp:6:14: error: assignment of read-only location ‘*(myMap + 2)’
   myMap[2] = 2;
              ^
std_less_check.cpp:6:14: error: cannot convert ‘int’ to ‘std::map<int,std::less<int> >(std::less<int> (*)())’ in assignment
std_less_check.cpp:7:23: warning: pointer to a function used in arithmetic [-Wpointer-arith]
   std::cout << myMap[2] << std::endl;

同时编译成功

#include <iostream>
#include <map>

int main(){
  std::map<int,std::less<int>> myMap(std::less<int>{});
  myMap[2] = 2;
  std::cout << myMap[2] << std::endl;
  return 0;
}

有人可以帮我解决这个问题吗?

解决方法

在第一个程序中,您有一个令人烦恼的解析。如果编译器可以将声明解析为变量或函数,它将选择将其解析为函数。

myMap 可以解析为函数声明。

它返回一个 std::map<int,int,std::less<int>>

它接受一个 std::less<int>() 类型的参数,它本身是一个函数类型,它返回一个 std::less<int> 并且不接受任何参数。请注意,您实际上不能将函数类型作为参数;该类型实际上是一个指向不带参数并返回 std::less<int> 的函数的指针。


在第二个程序中,用 () 替换 {} 解决了歧义。现在 myMap 不能再是函数声明,因此它声明了一个 std::map<int,std::less<int>> 类型的变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。