2013-03-20 69 views
-3

在問題中有很多東西,但是有沒有什麼辦法可以獲得使用模板類使用不透明ptr的封裝? (我的直覺是「不」,因爲編譯器必須知道編譯時的一切)模板和不透明指針是否繼承不兼容?

就像這樣,MyClass應該通過靜態庫公開,而MyClassImp是隱藏的。

//MyClass.h 
template <typename T> MyClassImp; 

template <typename T> MyClass 
{ 
public: 
    MyClass(); 
    void Foo(); 
private: 
    MyClassImp<T>* impl; 
} 
//MyClassImp.h 
template <typename T> MyClassImp 
{ 
public: 
    MyClassImp() {} 
    void Foo() {/*proprietary/complex stuff I want to hide*/} 
} 
//MyClass.cpp 
template <typename T> 
MyClass::MyClass() 
{ 
    impl = new MyClassImp(); 
} 
template <typename T> 
void MyClass::Foo() { impl->Foo(); } 

這不起作用,因爲MyClass的::富,藏在.cpp文件,不能沒有包括MyClassImp的定義暴露出來,所以你得到一個功能缺失的錯誤。

回答

1

他們沒有理由不相容。所有編譯器需要知道的是,有一個指針,並且該類型旁邊的那個小小的*就是這樣。儘管你的代碼片段有很多錯誤。定義模板及其定義後;

template <typename T> class MyClassImp; 

template <typename T> class MyClass 
{ 
private: 
    MyClassImp<T>* impl; 
}; 

int main() 
{ 
    MyClass<int> a; 
    return 0; 
} 

通知的class關鍵字:嘗試編譯此。如果你嘗試過,你會知道的。您可以編譯代碼上面:

g++ -std=c++98 -pedantic -Wall -Wextra a.cpp 

,你會得到的唯一的警告是,a未使用。

+0

是的,對不起,只是扔在一起psudo代碼。問題是,如果你確實使用了impl中的任何東西,你必須在頭文件中聲明整個類,否定opaque ptr的目的。 – IdeaHat 2013-03-20 18:31:16