gpt4 book ai didi

c++ - 调用重载的 ‘’ 与 suffices forpair 是不明确的

转载 作者:行者123 更新时间:2023-12-02 02:46:06 24 4
gpt4 key购买 nike

我无法编译以下代码。

void print_number(long n) {
std::cout << n << std::endl;
}

void print_number(float n) {
std::cout << n << std::endl;
}

void print_pair(std::pair<std::string, long> p) {
std::cout << std::get<1>(p) << std::endl;
}

void print_pair(std::pair<std::string, float> p) {
std::cout << std::get<1>(p) << std::endl;
}

int main() {
print_number(12l);
print_number(3.4f);

print_pair({"long", 12l});
print_pair({"float", 3.4f});

return 0;
}

print_number功能运行良好。然而,编译器提示重载的 print_pair功能: error: call of overloaded ‘print_pair(<brace-enclosed initializer list>)’ is ambiguous .

<brace-enclosed initializer list> 就足够了或std::pair不工作?如何重载接收 std::pair 的函数参数?

最佳答案

太;博士

为了解决歧义,您可以向编译器提供正确的类型:

print_pair(std::make_pair<std::string, long>("long", 12l));
print_pair(std::make_pair<std::string, float>("float", 3.4f));

print_pair(std::make_pair(std::string("long"), 12l));
print_pair(std::make_pair(std::string("float"), 3.4f));
<小时/>

歧义问题源于事实 "long""float"不是std::string ,而是const char[] .

因此,当您尝试构造 std::pair 时使用以下表达式:std::pair{"long", 12l} ,你得到的是 std::pair<const char[5], long> .

(与 float 相同;即 std::pair<const char[5], float> )。

您的重载print_pair接受 std::pair<std::string, long>std::pair<std::string, float> 。前面的类型都不匹配,因此编译器必须执行转换。因此,它无法自动扣除您想要执行的转换。两者都有效。

例如:

                    std::pair<const char[5], long>  
|
----------------------------------------------------------------
v v
std::pair<std::string, long> std::pair<std::string, float>

“证明”问题是 std::string ( longfloat 都不是),您还可以解决构造适当的 std::string 的歧义。 (而不是 char 数组):

print_pair(std::make_pair(std::string("long"), 12l));
print_pair(std::make_pair(std::string("float"), 3.4f));

C++17开始,这个样板可以简化为:

using namespace std::string_literals;

print_pair(std::pair{"long"s, 12l});
print_pair(std::pair{"float"s, 3.4f});

关于c++ - 调用重载的 ‘<brace-enclosed initializer list>’ 与 suffices forpair 是不明确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60076144/

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