gpt4 book ai didi

c++ - 即使存在转换,也无法将子类模板转换为基类的另一个模板

转载 作者:行者123 更新时间:2023-11-30 04:50:28 25 4
gpt4 key购买 nike

在下面的代码中:

class Class {
};

class Subclass : public Class {
};

template<typename T>
class Template1 {
public:
};

template<typename T>
class Template2 {
public:
template<typename Y>
Template2(const Template1<Y>& t1)
{
}
};

Template2<Class> f1(Template2<Class>& t2) {
return Template1<Subclass>();
}

Template2<Class> f2(Template2<Class> t2) {
return Template1<Subclass>();
}

int main() {
f1(Template1<Subclass>()); // error C2664: 'Template2<Class> f1(Template2<Class> &)': cannot convert argument 1 from 'Template1<Subclass>' to 'Template2<Class> &'
f2(Template1<Subclass>()); // OK
f1(Template2<Class>(Template1<Subclass>())); // OK
}

如果我从函数中删除引用或自己进行转换,一切都很好,但编译器似乎不想在其上从 Template1 转换为 Template2&自己的。为什么?

最佳答案

问题

您的 f1() 函数需要 lvalue对于通过引用传递的参数。不幸的是,隐式转换会产生一个不能用作左值的临时值。这会导致 C2664 error message .

解决方案

您只需将函数定义为,避免尝试引用转换产生的临时值

Template2<Class> f1(const Template2<Class>& t2) {  // const & can be used for temp
return Template1<Subclass>();
}

或者,更好的是,作为

Template2<Class> f1(Template2<Class>&& t2) {    // && is meant for exactly such cases
return Template1<Subclass>();
}

您甚至可以有两个这样的构造函数,一个用于左值引用 &,一个用于右值引用 &&,如果区别很重要的话。这里是online demo

关于c++ - 即使存在转换,也无法将子类模板转换为基类的另一个模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962251/

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