使用make_tuple构建问题 - arrary reference

时间:2015-08-11 00:37:45

标签: c++ c++11 reference tuples pass-by-reference

我有一个类,它引用一个大小为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 的关键,并使用 \ temp> 来插入条目,这会产生同样的错误。

我正在使用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;
}

1 个答案:

答案 0 :(得分:2)

在构建tuple之前,

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"));