2013-02-27 119 views
3

问题1>为什么下面的代码不能正常工作?错误C2440:初始化:不能从转换“的std ::矢量<_Ty>”到“常量的std ::矢量<_Ty>&`

问题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; 
} 
+0

我的直觉告诉我,(如果可能),它是一个丑陋的解决方案,鉴于刚刚铸造一个'升压:: shared_ptr的'到'升压:: shared_ptr的'要求['static_pointer_cast'](http://stackoverflow.com/questions/4764398/how-to-use-boostsmart-ptr-in-polymorphism) – Cornstalks 2013-02-27 05:17:14

+0

我使用一根'的boost :: shared_ptr的'这与初始化'的boost :: shared_ptr的',它按预期工作。只是好奇,为什么收集这样的东西不起作用。 – q0987 2013-02-27 05:29:18

回答

4

在C++编译器的视图,shared_ptr<BaseClass>shared_ptr<DerivedClass>是不同的,不相关的类型。虽然编译器知道,正常的指针可以从Derived*转换为Base*,它不知道,在概念上同样要申请shared_ptr S,因为它不知道“智能指针”是指针等。

这同样适用于载体或一般模板:模板的两个示例是两个不同的类,它有没有关系悫他们(如果没有明确的设计)。所以编译器看到一个vector<Something>绑定到一个参考vector<SomethingElse>这是不相关的类型,所以引用绑定失败。

但即使种了某种联系,绑定会失败:

long l = 5; 
int& ir = l; //ERROR 
1

shared_ptr<BaseClass>shared_ptr<SubClass>是不同的,不相关的类型,所以没有办法对一个向量别名其他的矢量,因为不能保证它们的对象布局是一样的。

这意味着,例如将const std::vector<boost::shared_ptr<BaseClass> >&传递给一个函数,您必须构造所需类型的临时向量。但是你可以这样做不增加的共享指针引用计数,使用共享指针别名:

#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); 
} 
+0

代码中存在一个错误。 w的大小是2 * v.size()而不是v.size()。 – q0987 2013-03-05 15:22:49

+0

@ q0987干杯,固定 – ecatmur 2013-03-06 16:45:18

相关问题