거의 모든 것이 궁금하지만, 템플릿 클래스에서 불투명 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에 :: 푸, MyClassImp의 정의를 포함하지 않고 노출 될 수 없기 때문에 당신이 기능없는 오류가 발생하므로이 작동하지 않습니다.
그래, 미안해, 그냥 psudo 코드를 던졌다. 문제는 impl에서 무엇인가를 사용한다면 헤더 파일에 전체 클래스를 선언해야한다는 것이다. 즉, opaque ptr의 목적을 무효화해야한다. – IdeaHat