gpt4 book ai didi

C++ 模板 : no matching function for call

转载 作者:太空狗 更新时间:2023-10-29 23:11:17 24 4
gpt4 key购买 nike

我无法理解为什么这个程序无法使用 -std=c++14 使用 g++ 7.3 或 clang++ 5.0 进行编译。

A 可以从 const int 初始化,如图所示。对 A 的 const 引用也可以从 const int 创建,但使用 const int 调用 f(const A &) 失败。为什么?

#include <iostream>

struct V {
int i;
template <class T>
V(const T &t) : i{t} {}
};

struct A {
int i;
A(V v) : i{v.i} {}
};

void f(const A &) {}

int main() {
const auto i = 42;
const A a1{i}; // OK
std::cout << a1.i << '\n'; // 42
const A &a2 = A{i}; // OK
std::cout << a2.i << '\n'; // 42
f(i); // no matching function for call to 'f'
return 0;
}

最佳答案

给定 f(i);copy initialization被申请;被应用。而i(with type const int)需要转换为A,需要两次自定义转换;从 const intV,从 VA。但是在一个隐式转换序列中只允许一个用户定义的转换。

Bot const A a1{i};const A &a2 = A{i};direct initialization , 只有一个从i(const int 类型)到A 的构造函数(即V)的参数的隐式转换code>) 是必需的,所以它们工作正常。

注意复制初始化和直接初始化的区别,

In addition, the implicit conversion in copy-initialization must produce T directly from the initializer, while, e.g. direct-initialization expects an implicit conversion from the initializer to an argument of T's constructor.

作为解决方法,您可以在将 i 传递给 f() 之前对其执行显式转换。

关于C++ 模板 : no matching function for call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51055276/

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