2015-02-09 52 views
0

我有以下情形:C++導出模板執行不完全類型的

header.h:

class A 
{ 
    public: 

    class B; // incomplete type 

private: 
    // is never used outside of source file for A 
    std::vector<B> vector_of_bs; // template 
} 

source1.cpp:

class A::B {}; // defined here 

一切都很好,直到這裏。現在,如果我想使用class A其他地方它不工作:

source2.cpp:採用A級,不與

矢量(721)編譯:錯誤C2036: 'A :: B *' :未知尺寸

在編譯類模板的成員函數 '的std ::矢量< _Ty> &的std ::矢量< _Ty> ::運算符=(常量的std ::矢量< _Ty> &)'

VS2010中的

。我如何鏈接到source1.o中std :: vector的模板特化?

我還需要與declspec(_dllimport)使用此...

回答

1

標準庫容器cannot be instantiated with incomplete types。這樣做是未定義的行爲,並在你的情況下產生一個明確的錯誤。其他實現會默默接受你的代碼。

爲了解決這個問題,boost提供了counterparts for the standard library containers that can in fact be instantiated with incomplete types。你可以用升壓版本代替std::vector來修復你的代碼:

#include <boost/container/vector.hpp> 

class A 
{ 
public: 
    class B; // incomplete type 

private: 
    boost::vector<B> vector_of_bs; 
}; 
+0

我不認爲這就足夠了。當生成副本分配/析構函數/拷貝構造函數等時,必須完成「B」,因此您可能需要在類定義中顯式聲明,然後在「B」完成的源文件中顯式默認,類似於帶'unique_ptr'的pimpls。 – 2015-02-09 19:28:07