gpt4 book ai didi

c++ - 类型推导失败 : shared_ptr of derived template to base template as function argument

转载 作者:行者123 更新时间:2023-11-30 01:03:21 24 4
gpt4 key购买 nike

这里我声明了两个模板类:A和B,B派生自A:

template<typename T>
class A {
public:
int a;
T t;
};

template<typename T>
class B : public A<T> {
public:
int b;
};

我做了一个 shared_ptr<B<T>>并将其分配给 shared_ptr<A<T>> , 没关系:

auto b = std::make_shared<B<std::string>>();
std::shared_ptr<A<std::string>> a = b;

这里我声明了一个模板函数接受shared_ptr A<T> :

template<typename T>
void proc(std::shared_ptr<A<T>> &a) {
std::cout << a->a << std::endl;
}

它接受 a作为参数,但拒绝 b :

proc<std::string>(a); // OK
proc<std::string>(b); // template argument deduction/substitution failed
// cannot convert 'b' (type 'std::shared_ptr<B<std::__cxx11::basic_string<char> > >') to type 'std::shared_ptr<A<std::__cxx11::basic_string<char> > >&'

我使用 g++ 作为带有 -std=c++11 的编译器。

这个错误给我带来了很多问题,我该如何优雅地解决这个问题?

最佳答案

给定proc<std::string>(b); , b需要转换为std::shared_ptr<A<std::string>> .这意味着临时 std::shared_ptr<A<std::string>>将被构造然后传递给proc . proc的参数类型是对非常量的左值引用,即 std::shared_ptr<A<T>> & ,不能绑定(bind)到临时对象。

您可以将参数类型更改为对 const 的左值引用,这可以绑定(bind)到临时对象。例如

template<typename T>
void proc(const std::shared_ptr<A<T>> &a) {
// ^^^^^
std::cout << a->a << std::endl;
}

关于c++ - 类型推导失败 : shared_ptr of derived template to base template as function argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53679277/

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