2008-11-20 58 views
38

是否可以在頭文件中轉發聲明STL容器?例如,採取以下代碼:轉發聲明一個STL容器?

#include <vector> 

class Foo 
{ 
private: 
    std::vector<int> container_; 
    ... 
}; 

我希望能夠做這樣的事情:

namespace std 
{ 
    template <typename T> class vector; 
} 

class Foo 
{ 
private: 
    std::vector<int> container_; 
    ... 
}; 

可以這樣做?

回答

27

std命名空間中聲明vector未定義的行爲。所以,你的代碼可能工作,但它也可能不工作,編譯器沒有義務告訴你什麼時候你的嘗試不起作用。這是一場賭博,我不知道避免包含標準C++頭文件是值得的。

請參見下面的comp.std.C++主持討論:

forward declaring std::vector. Works, but is it legal and standard compliant?

16

我不這麼認爲,因爲編譯器無法知道爲container_對象分配了多少空間。最好你可以這樣做:

std::vector<int> *container_; 

並在構造函數中新建它,因爲編譯器知道指針的大小。

+0

正是我想說的 – badbadboy 2008-11-21 00:01:22

+0

正確,但是這是所有前向聲明的問題,而不是'namespace std`中的那些特定的問題。所以它回答了_real_問題,而不是OP問的問題。 :P我們根本無法轉發 - 聲明某些東西,然後通過值實例化它,原因很明顯。 – 2017-06-02 19:20:03