2013-02-27 122 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

相關問題