模板和不透明指针是否在继承上不兼容

Are templates and opaque pointers inheritenly incompatible?

本文关键字:继承 不兼容 是否 指针 不透明      更新时间:2023-10-16

几乎都在问题中,但是是否有任何方法可以从使用模板类的不透明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(); }

这不起作用,因为隐藏在.cpp文件中的MyClass::Foo如果不包含MyClassImp的定义就不能公开,所以您会得到一个函数缺失错误。

它们没有理由不兼容。编译器只需要知道有一个指针,类型旁边的小*告诉我们这个。你的代码片段有很多错误。试着编译这个:

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未使用。