重载函数的地址与所需类型不匹配

address of overloaded function does not match required type

所以我使用的构造函数如下所示:

deduplicator(std::function<void(const std::vector<uint8_t>&, std::vector<uint8_t>&)> chunk_fingerprinter);

我使用这个函数作为区块指纹识别器:

void sha1_hash(const std::vector<uint8_t>& data, std::vector<uint8_t>& hash);

我这样初始化对象:

deduplication::deduplicator dedup = deduplication::deduplicator(harpocrates::hashing::sha1_hash);

导致此错误的结果:

../src/split-deduplication/split-deduplication.cpp:35:32: error: address of overloaded function 'sha1_hash' does not match required type 'void'
    void* hash_func = (void*) &harpocrates::hashing::sha1_hash;
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../resolve_symlinks/harpocrates/src/harpocrates/hashing.hpp:34:10: note: candidate function
    void sha1_hash(const std::vector<uint8_t>& data, std::vector<uint8_t>& hash);
         ^
../resolve_symlinks/harpocrates/src/harpocrates/hashing.hpp:40:10: note: candidate function
    void sha1_hash(const uint8_t* data, const size_t size, uint8_t* hash);

但如果我稍微涉足黑魔法并做到这一点:

    void (*sha1_hash)(const std::vector<uint8_t>&, std::vector<uint8_t>&) = harpocrates::hashing::sha1_hash;
    deduplication::deduplicator dedup = deduplication::deduplicator(sha1_hash);

然后它起作用了,有人可以向我解释为什么会这样吗?如果有区别,我正在使用 C++17

编辑: 犯了一个错误,我已将 sha1_hash 函数更新为我调用的正确函数

解决方案:

我在同一个命名空间中有两个同名的函数,正如下面指出的,在这种情况下,干净的解决方案是拆分成两个命名空间。 正如人们提到的那样,这是因为编译器无法选择使用哪一个。

从错误信息来看,我认为 sha1_hash 过载了。


void (*sha1_hash)(const std::vector<uint8_t>&, std::vector<uint8_t>&) = harpocrates::hashing::sha1_hash; 之所以有效,是因为在执行 address of an overloaded function 重载决议时,选择了签名与 sha1_hash 类型匹配的重载,即 void (*)(const std::vector<uint8_t>&, std::vector<uint8_t>&).

In all these contexts, the function selected from the overload set is the function whose type matches the pointer to function, reference to function, or pointer to member function type that is expected by target: the object or reference being initialized, the left-hand side of the assignment, function or operator parameter, the return type of a function, the target type of a cast, or the type of the template parameter, respectively.

您也可以使用static_cast来明确指定。

auto sha1_hash = static_cast<void (*)(const std::vector<uint8_t>&, std::vector<uint8_t>&)>(harpocrates::hashing::sha1_hash);

如错误消息所述,void* hash_func = (void*) &harpocrates::hashing::sha1_hash; 不起作用,因为 void* 与重载 sha1_hash 的任一签名都不匹配,然后重载解析失败。

顺便说一句:尝试将函数指针转换为 void* 似乎是个坏主意,尤其是在这种情况下您根本不需要它。