Как описано в библиотеке MSDN here Я хотел немного поэкспериментировать с идиомой pimpl. Сейчас у меня есть Foo.hpp
сШаблонные классы с неправильной идиомой pimpl
template<typename T>
class Foo {
public:
typedef std::shared_ptr<Foo<T>> Ptr;
Foo();
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
где параметр T
не используется еще. Реализация хранится в Foo.cpp
template<typename T>
class Foo<T>::Impl {
public:
int m_TestVar;
};
template<typename T>
Foo<T>::Foo() : pImpl(new Impl) {
this->pImpl->m_TestVar = 0x3713;
}
В настоящее время компилятор имеет две ошибки и одно предупреждение:
use of undefined type 'Foo<T>::Impl'; ... vc\include\memory in line 1150
can't delete an incomplete type; ... vc\include\memory in line 1151
deletion of pointer to incomplete type 'Foo<T>::Impl'; no destructor called; ... vc\include\memory in line 1152
Что такое concflict здесь и как я могу это решить?
Редактировать. Удалено, позвонив по телефону std::make_shared
- копия & сбой на основе одной старой версии.
1. Определения ** должны быть ** в файле заголовка (из-за шаблона). 2. Я не вижу 'Foo :: Foo' –
@KirilKirov: переместив все определения в файл заголовка, я бы отказался от любых улучшений скорости во время компиляции, и все вызывающие элементы заголовка должны были быть перекомпилированы при изменении Impl просто потому что это шаблонный класс (по сравнению с описанием из библиотеки MSDN). Должен ли я использовать идиому pimpl для развязки частей? –
взгляните на это: http://herbsutter.com/gotw/_101/ –