使用模板将 std::shared_ptr<Derived> 向上转换为 std::shared_ptr<Base>
Upcasting std::shared_ptr<Derived> to std::shared_ptr<Base> with templates
我在继承链中有 4 个 classes:A->B->C,A->B->D,其中 B 是唯一的 class 模板。
我想要一个在 ID 和对象指针(C 或 D)之间映射的 std::map,但是我无法将 make_shared 输出分配给 std::map。
有趣的是,另一个类似的例子,但没有中间模板 class 编译正常,所以我想这与此有关。
#include <iostream>
#include <map>
#include <memory>
class A
{
public:
int i;
protected:
A(int j) : i(j) {}
};
template <typename T>
class B : protected A
{
protected:
T t;
B(int i) : A(i) {}
};
class C : protected B<int>
{
public:
C(int i) : B(i) {}
};
class D : protected B<float>
{
public:
D(float i) : B(i) {}
};
int main()
{
std::map<std::string, std::shared_ptr<A>> map; // [id, object ptr]
map["c"] = std::make_shared<C>(0); // error here
map["d"] = std::make_shared<D>(1.0); // error here
for (auto i : map)
{
std::cout << i.first << i.second->i << std::endl;
}
return 0;
}
编译错误:
main.cpp:37:37: error: no match for ‘operator=’ (operand types are ‘std::map<std::__cxx11::basic_string<char>, std::shared_ptr<A> >::mapped_type {aka std::shared_ptr<A>}’ and ‘std::shared_ptr<C>’)
map["c"] = std::make_shared<C>(0); // error
您尝试的转换在 class 及其子项之外。它无法工作,因为继承是非 public。要修复它,请继承 public。或者,在成员函数内进行转换。
我在继承链中有 4 个 classes:A->B->C,A->B->D,其中 B 是唯一的 class 模板。
我想要一个在 ID 和对象指针(C 或 D)之间映射的 std::map,但是我无法将 make_shared 输出分配给 std::map。
有趣的是,另一个类似的例子,但没有中间模板 class 编译正常,所以我想这与此有关。
#include <iostream>
#include <map>
#include <memory>
class A
{
public:
int i;
protected:
A(int j) : i(j) {}
};
template <typename T>
class B : protected A
{
protected:
T t;
B(int i) : A(i) {}
};
class C : protected B<int>
{
public:
C(int i) : B(i) {}
};
class D : protected B<float>
{
public:
D(float i) : B(i) {}
};
int main()
{
std::map<std::string, std::shared_ptr<A>> map; // [id, object ptr]
map["c"] = std::make_shared<C>(0); // error here
map["d"] = std::make_shared<D>(1.0); // error here
for (auto i : map)
{
std::cout << i.first << i.second->i << std::endl;
}
return 0;
}
编译错误:
main.cpp:37:37: error: no match for ‘operator=’ (operand types are ‘std::map<std::__cxx11::basic_string<char>, std::shared_ptr<A> >::mapped_type {aka std::shared_ptr<A>}’ and ‘std::shared_ptr<C>’)
map["c"] = std::make_shared<C>(0); // error
您尝试的转换在 class 及其子项之外。它无法工作,因为继承是非 public。要修复它,请继承 public。或者,在成员函数内进行转换。