Являются ли шаблоны и непрозрачные указатели наследственно несовместимыми?

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

-3

Решение

Нет причин, по которым они должны быть несовместимыми. Все, что нужно знать компилятору, это наличие указателя и * рядом с типом говорит именно это. Ваш фрагмент кода имеет много ошибок, хотя. Попробуйте скомпилировать это:

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 не используется.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]