2013-03-20 60 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