2016-01-14 53 views
2

使用下一個定義與類模板

class A {}; 
class B : public A {}; 

void f(A* a) {} 

調用f(new B)隱式轉換是可能的,因爲B*隱式轉換爲A*,對不對?

但是,當像std::vector這樣的類模板執行此操作時,會生成編譯錯誤。

void f(std::vector<A*> v) 
{} 

int main() 
{ 
    std::vector<B*> v; 
    f(v); //error! "no suitable user-defined conversion..." 

    return 0; 
} 

這是爲什麼?

+0

'std :: vector '和'std :: vector '是完全不同的類型,但'B'是從'A'驅動的。 – Rabbid76

+0

有沒有解決方法? – Pilpel

回答

2

std::vector<B*>std::vector<A*>是完全不同的類型,但BA派生。將數據複製從std::vector<B*>std::vector<A*>使用std::copystd::back_inserter

#include <algorithm> // std::copy 
#include <iterator> // std::back_inserter 

std::vector<B*> b; 
std::vector<A*> a; 
std::copy(b.begin(), b.end(), std::back_inserter(a)); 

...或統一初始化初始化a

std::vector<B*> b; 
std::vector<A*> a{ b.begin(), b.end() }; 
1

std::vector<B*>std::vector<A*>是不同的,在所有的,因爲他們的模板參數型是不同的。

作爲一種變通方法,可以使用的另一種vector構造函數,即template<class InputIt> std::vector::vector(InputIt first, InputIt last),如:

f(std::vector<A*>(v.begin(), v.end())); 

或只是(需要C++ 11)

f({v.begin(), v.end()}); 

LIVE

0

正如在評論中指出的,std::vector<A*>是與std::vector<B*>不同的類型。這並不妨礙您將B*對象存儲在std::vector<A*>向量中。正如你猜測的那樣,基類指針可以指向派生對象,這就是爲什麼你可以將它們存儲在基類向量中的原因。

您還應該使v成爲f原型的參考。

Punchline:你並不需要std::vector<B*>