make_tuple 的构建问题 - 数组引用
build issue with make_tuple - arrary reference
我有一个 class,它将对大小为 5 的数组的引用作为构造函数中的参数之一。
class sha1 {
public:
typedef unsigned int(&type)[5];
type digest_;
sha1(const type digest) : digest_(digest)
{}
};
我可以通过传递 5 的数组来实例化此 class。但是用对 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
我怎样才能完成这项工作?这里的代码已经简化了很多,以便于解释。我想做的是使用 class 作为 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_tuple
will decay
你在构造tuple
之前传递给它的参数,所以unsigned int(&)[5]
类型被转换为unsigned int *
,这与你的[=16]不匹配=] 构造函数的参数类型.
改为使用 forward_as_tuple
来创建引用元组。
map.emplace(std::piecewise_construct,
std::forward_as_tuple(digest, 10),
std::forward_as_tuple("test"));
我有一个 class,它将对大小为 5 的数组的引用作为构造函数中的参数之一。
class sha1 {
public:
typedef unsigned int(&type)[5];
type digest_;
sha1(const type digest) : digest_(digest)
{}
};
我可以通过传递 5 的数组来实例化此 class。但是用对 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
我怎样才能完成这项工作?这里的代码已经简化了很多,以便于解释。我想做的是使用 class 作为 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_tuple
will decay
你在构造tuple
之前传递给它的参数,所以unsigned int(&)[5]
类型被转换为unsigned int *
,这与你的[=16]不匹配=] 构造函数的参数类型.
改为使用 forward_as_tuple
来创建引用元组。
map.emplace(std::piecewise_construct,
std::forward_as_tuple(digest, 10),
std::forward_as_tuple("test"));