gpt4 book ai didi

c++ - make_tuple 的构建问题 - 数组引用

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:02 25 4
gpt4 key购买 nike

我有一个类将大小为 5 的数组作为构造函数中的参数之一。

class sha1 {
public:
typedef unsigned int(&type)[5];
type digest_;
sha1(const type digest) : digest_(digest)
{}
};

我可以通过传递 5 的数组来实例化此类。但是用对 std::make_tuple 的调用替换它无法编译。

int main(int argc, const char* const argv[]) {
unsigned int digest[5] = { 0 };
const sha1 s(digest);
const sha1 p = std::make_tuple(digest); <-- error here
return 0;
}

错误:

error C2440: 'initializing': cannot convert from 'std::tuple<unsigned int *>' to 'sha1'
note: No constructor could take the source type, or constructor overload resolution was ambiguous

我怎样才能使这项工作?这里的代码已经简化了很多,以便于解释。我想做的是将该类用作 unordered_map 的键并使用 emplace 插入条目,这给出了同样的错误。

我正在使用 Visual Studio 2015

这是带有 unordered_map 的代码

#include <iostream>
#include <unordered_map>

class sha1 {
public:
typedef unsigned int(&type)[5];
const type digest_;
const int index_;
sha1(const type digest, int index) : digest_(digest), index_(index)
{}
bool operator==(const sha1& that) const {
return true;
}
};

namespace std {
template<> struct hash<sha1> {
inline size_t operator()(const sha1& p) const {
return 0;
}
};
}

int main(int argc, const char* const argv[]) {
unsigned int digest[5] = { 0 };

const sha1 s(digest, 10); // works

std::unordered_map<sha1, std::string> map;

map.insert(std::make_pair(sha1(digest, 10), "test")); // works

map.emplace(std::piecewise_construct, std::make_tuple(digest, 10), std::make_tuple("test")); // <-- error here

return 0;
}

最佳答案

make_tupledecay在构造元组之前传递给它的参数,因此unsigned int(&)[5]类型被转换为unsigned int *,这与您的 sha1 构造函数的参数类型不匹配。

使用forward_as_tuple而是创建一个引用元组。

map.emplace(std::piecewise_construct,
std::forward_as_tuple(digest, 10),
std::forward_as_tuple("test"));

关于c++ - make_tuple 的构建问题 - 数组引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31931373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com