在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, 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, 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, int, std::less<int>>类型的变量。

最新更新