error: 'class std::unordered_multimap<std::__cxx11::basic_string<char>, QWidget*>' has no member named 'lower_bound' auto ite = m_mIdMapWidget.lower_bound(frame.m_sMemberID); ^~~~~~~~~~~
时间: 2023-10-26 21:04:42 浏览: 108
这个错误提示意味着你在 `std::unordered_multimap<std::__cxx11::basic_string<char>, QWidget*>` 类型的对象上调用了 `lower_bound` 函数,但该类型并没有名为 `lower_bound` 的成员函数。
`std::unordered_multimap` 类型的对象本身是支持 `lower_bound` 函数的,因此出现这个错误的原因可能是因为你的头文件或命名空间有误。
请确保在代码中包含了正确的头文件,并且在使用 `lower_bound` 函数时使用了 `std` 命名空间,例如:
```cpp
#include <unordered_map>
int main()
{
std::unordered_multimap<std::string, QWidget*> m_mIdMapWidget;
// 使用 lower_bound 函数
auto ite = m_mIdMapWidget.lower_bound("member_id");
// ...
}
```
如果你已经使用了正确的头文件和命名空间,但仍然遇到这个错误,请检查你的编译选项是否正确。如果使用了一些较旧的编译器,可能需要在编译时指定 `-std=c++11` 或更高版本的标准以支持 C++11 的新特性。
相关问题
class std::unordered_map<std::__cxx11::basic_string<char>, void*>’ has no member named ‘contains’
您遇到的错误信息表明您尝试在一个`std::unordered_map`类型的对象上调用`contains`方法,但是这个方法在您使用的C++标准库版本中不存在。`contains`方法是在C++20标准中引入的,用于检查容器中是否包含指定的键。
在C++20之前,要检查一个键是否存在于`unordered_map`中,您需要使用`find`方法。`find`方法会返回一个迭代器指向找到的元素,如果键不存在,则返回`end()`迭代器。下面是如何使用`find`方法来检查键是否存在:
```cpp
#include <unordered_map>
#include <string>
std::unordered_map<std::string, void*> myMap;
// ...
if (myMap.find("key") != myMap.end()) {
// 键 "key" 存在于 map 中
} else {
// 键 "key" 不存在于 map 中
}
```
如果您使用的是C++20或更高版本,您可以直接使用`contains`方法:
```cpp
if (myMap.contains("key")) {
// 键 "key" 存在于 map 中
} else {
// 键 "key" 不存在于 map 中
}
```
确保您使用的编译器支持C++20,并且在编译时启用了C++20标准,否则即使C++20已经发布,您也无法使用`contains`方法。您可以通过在编译时添加`-std=c++20`标志来启用C++20标准。
error: call to non-'constexpr' function 'std::size_t std::hash<std::__cxx11::basic_string<char> >::operator()(const string&) const'
这个错误是因为编译器无法确定 `std::hash<std::string>::operator()` 函数的返回值是否是编译期常量,因此不能在 `constexpr` 上下文中使用该函数。
解决方法是使用 `constexpr` 关键字显式地声明 `std::hash<std::string>::operator()` 函数是一个 `constexpr` 函数。示例代码如下:
```c++
#include <iostream>
#include <functional>
#include <string>
using namespace std;
// 显式声明 std::hash<std::string>::operator() 是一个 constexpr 函数
namespace std {
template<>
struct hash<string> {
constexpr size_t operator()(const string& str) const {
return std::_Hash_impl::hash(str.data(), str.length());
}
};
}
int main() {
unordered_map<size_t, string> map = {
{hash<string>()("hello"), "Hello World!"},
{hash<string>()("world"), "World Hello!"},
{hash<string>()("good"), "Good Morning!"},
{hash<string>()("night"), "Good Night!"}
};
string str;
cout << "Please enter a string: ";
getline(cin, str);
switch (hash<string>()(str)) {
case hash<string>()("hello"):
cout << map[hash<string>()("hello")] << endl;
break;
case hash<string>()("world"):
cout << map[hash<string>()("world")] << endl;
break;
case hash<string>()("good"):
cout << map[hash<string>()("good")] << endl;
break;
case hash<string>()("night"):
cout << map[hash<string>()("night")] << endl;
break;
default:
cout << "Unknown input!" << endl;
break;
}
return 0;
}
```
在上面的代码中,我们显式声明了 `std::hash<std::string>::operator()` 函数是一个 `constexpr` 函数,编译器就可以确定该函数的返回值是编译期常量,从而避免了上述编译错误。
阅读全文
相关推荐
















