首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使容器协变

使容器协变
EN

Stack Overflow用户
提问于 2016-10-28 15:02:44
回答 1查看 138关注 0票数 0

我正在实现指针的自定义向量my_ptr_vector

我有一个类Base和一个派生BaseDerived

我有一个方法,应该采取行动(通过参照!)在my_ptr_vector<Base>my_ptr_vector<Derived>上。当然,它只调用Base类中的元素方法。

但是,编译器抱怨它无法将my_ptr_vector<Derived>转换为my_ptr_vector<Base>

复制问题的最小示例:

代码语言:javascript
复制
#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);
}

错误:

代码语言:javascript
复制
no suitable user-defined conversion from "my_ptr_vector<Derived>" to "const my_ptr_vector<Base>" exists 

我已经找到了这里,如果我从my_ptr_vector<U>提供一个构造函数和赋值操作符(带有U泛型),就可以使它工作,这样U*就可以转换为T*

实际上,如果在示例中我将类更改为这个类,它就会工作。

代码语言:javascript
复制
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模板:

代码语言:javascript
复制
template<typename T>
    void funct(const my_ptr_vector<T>& vect) {}

但是,通过这种方式,我丢失了func中的vect元素始终是Base类型的信息。

EN

回答 1

Stack Overflow用户

发布于 2016-10-28 17:07:51

这似乎是你想做的事。代码的第二部分,复制器,不需要修改。

我不认为你可以不需要投到std::unique_ptr。它想要这样,即使它正在推动一个Base*

代码语言:javascript
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40307902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档