我想将键值对插入到
std::map
中,其中 uint32_t
作为键类型和值的自定义类型。根据std::map
的文档,我编写了以下代码:
#include <cstdint>
#include <iostream>
#include <map>
struct Values
{
uint32_t a = 0;
uint32_t b = 0;
Values(uint32_t _x, uint32_t _y): a(_x), b(_y)
{
std::cout << __func__ << "(" << _x << ", " << _y ")" << std::endl;
}
};
int main()
{
std::map<uint32_t, Values> data;
for(uint32_t i = 0; i < 100; i++)
data.emplace(i, std::forward_as_tuple(i, i));
return 0;
}
我正在通过运行
gcc
来编译代码
gcc -O3 -std=c++23 -Wconversion -Wall -Wextra -Wpedantic -fanalyzer
但是,此代码无法编译。
这是编译器资源管理器的链接,您可以在其中查看
gcc
的完整输出。
gcc
正在抱怨:
error: no matching function for call to 'construct_at(std::pair<const unsigned int, Values>*&, unsigned int&, std::tuple<unsigned int&, unsigned int&>)'
为什么我会收到此错误以及如何修复此错误?
尝试指定
std::piecewise_construct
(请参阅https://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple中的示例),例如:
m.emplace(std::piecewise_construct,
std::forward_as_tuple(i),
std::forward_as_tuple(i, i));