Почти все в этом вопросе, но есть ли способ получить инкапсуляцию, которую вы получаете от использования непрозрачного 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 :: Foo, скрытый в файле .cpp, не может быть предоставлен без включения определения 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
не используется.
Других решений пока нет …