C++ 错误C2440:&x27;初始化';:无法从';标准::向量<_Ty>';至';const std::vector<_Ty>&`

C++ 错误C2440:&x27;初始化';:无法从';标准::向量<_Ty>';至';const std::vector<_Ty>&`,c++,boost,C++,Boost,问题1>为什么以下代码不起作用 问题2>正确的设计方法是什么 #include <iostream> #include <vector> #include "boost/shared_ptr.hpp" using namespace std; class BaseClass {}; class SubClass : public BaseClass {}; int main() { std::vector<boost::shared_ptr<S

问题1>为什么以下代码不起作用

问题2>正确的设计方法是什么

#include <iostream>
#include <vector>
#include "boost/shared_ptr.hpp"

using namespace std;

class BaseClass
{};

class SubClass : public BaseClass
{};

int main()
{
    std::vector<boost::shared_ptr<SubClass> > vecSubClassShared;

    boost::shared_ptr<SubClass> sub1(new SubClass);

    vecSubClassShared.push_back(sub1);

    // Error    1   error C2440: 'initializing' : cannot convert from 'std::vector<_Ty>' to 'const std::vector<_Ty> &`
    const std::vector<boost::shared_ptr<BaseClass> >& vecBaseShared = vecSubClassShared;
}
#包括
#包括
#包括“增压/共享_ptr.hpp”
使用名称空间std;
类基类
{};
类子类:公共基类
{};
int main()
{
std::向量向量子类共享;
boost::shared_ptr sub1(新的子类);
vecsublasshared.push_back(sub1);
//错误1错误C2440:“正在初始化”:无法从“std::vector”转换为“const std::vector”&`
const std::vector&vecBaseShared=vecsublassShared;
}

<代码> > P>在C++编译器的视图中, StdRypPTR 和SyddYPPT/<代码>是不同的、不相关的类型。虽然编译器知道普通指针可以从
派生*
转换为
基*
,但它不知道在概念上同样适用于
共享
s,因为它不知道“智能指针”类似于指针

这同样适用于向量或模板:模板的两个实例化是两个不同的类,它们之间没有关系(如果没有明确设计)。因此,编译器会看到一个
向量
绑定到一个
向量
的引用,而该引用不属于相关类型,因此引用绑定失败

但即使这些类型之间存在某种关联,绑定也会失败:

long l = 5;
int& ir = l; //ERROR
shared_ptr
shared_ptr
是不同的、不相关的类型,因此一个向量无法别名另一个向量,因为无法保证它们的对象布局相同

这意味着,要将
const std::vector&
传递给函数,必须构造所需类型的临时向量。但是,您可以使用共享指针别名在不增加共享指针上的引用计数的情况下执行此操作:

#include <vector>
#include <memory>

struct B {};
struct D: public B {};

template<typename T, typename U>
std::vector<std::shared_ptr<T>> shared_vector_static_cast(
   const std::vector<std::shared_ptr<U>> &v)
{
   std::vector<std::shared_ptr<T>> w;
   for (const std::shared_ptr<U> &p: v)
      w.push_back(std::shared_ptr<T>(std::shared_ptr<void>(), p.get()));
   return w;
}

int main() {
    std::vector<std::shared_ptr<D>> v{std::make_shared<D>()};
    const std::vector<std::shared_ptr<B>> &w = shared_vector_static_cast<B>(v);
}
#包括
#包括
结构B{};
结构D:公共B{};
模板
std::矢量共享\矢量\静态\强制转换(
const std::vector&v)
{
std::向量w;
用于(const std::shared_ptr&p:v)
w、 向后推(std::shared_ptr(std::shared_ptr(),p.get());
返回w;
}
int main(){
std::vector v{std::make_shared()};
const std::vector&w=共享向量静态广播(v);
}

我的直觉告诉我(如果可能的话)这是一个丑陋的解决方案,因为仅仅将一个
boost::shared_ptr
转换为
boost::shared_ptr
需要我使用一个
boost::shared_ptr
初始化为
boost::shared_ptr
,它可以正常工作。只是好奇,为什么这些东西的集合不起作用。代码中有一个bug。w的大小是末端为2*v.size()而不是v.size()。