我正在实现指针的自定义向量my_ptr_vector。
我有一个类Base和一个派生Base的Derived。
我有一个方法,应该采取行动(通过参照!)在my_ptr_vector<Base>和my_ptr_vector<Derived>上。当然,它只调用Base类中的元素方法。
但是,编译器抱怨它无法将my_ptr_vector<Derived>转换为my_ptr_vector<Base>。
复制问题的最小示例:
#include <vector>
#include <memory>
class Base {};
class Derived : public Base {};
template<typename Element>
class my_ptr_vector : public std::vector< std::unique_ptr< Element > > {};
void funct(const my_ptr_vector<Base>& vect) {}
int main()
{
my_ptr_vector<Derived> vect;
funct(vect);
}错误:
no suitable user-defined conversion from "my_ptr_vector<Derived>" to "const my_ptr_vector<Base>" exists 我已经找到了这里,如果我从my_ptr_vector<U>提供一个构造函数和赋值操作符(带有U泛型),就可以使它工作,这样U*就可以转换为T*。
实际上,如果在示例中我将类更改为这个类,它就会工作。
template<typename Element>
class my_ptr_vector : public std::vector< std::shared_ptr< Element > > {
public:
my_ptr_vector() {}
///copy constructor from vector of pointers to generic U
template<typename DerivedElement>
my_ptr_vector(const my_ptr_vector<DerivedElement>& oth)
{
printf("Oh, noes!"); //we don't want this method executed!
resize(oth.size());
for (std::shared_ptr< Element > ptr : oth)
{
push_back(ptr);
}
}
};但是,它确实在构造函数中执行print语句--它不仅仅是一个提示,它不应该担心;它实际上正在执行转换!
有什么办法可以避免这种情况吗?
当然,另一个可能的解决方案是制作func模板:
template<typename T>
void funct(const my_ptr_vector<T>& vect) {}但是,通过这种方式,我丢失了func中的vect元素始终是Base类型的信息。
发布于 2016-10-28 17:07:51
这似乎是你想做的事。代码的第二部分,复制器,不需要修改。
我不认为你可以不需要投到std::unique_ptr。它想要这样,即使它正在推动一个Base*。
#include <vector>
#include <memory>
class Base {};
class Derived : public Base {};
template<typename Element>
class my_ptr_vector : public std::vector< std::unique_ptr< Element > > {};
void funct(const my_ptr_vector<Base>& vect) {}
int main()
{
my_ptr_vector<Base> vect;
vect.push_back(std::unique_ptr<Base>(new Derived));
funct(vect);
}https://stackoverflow.com/questions/40307902
复制相似问题