std :: unique_ptr pimpl na dll gera C4251 com o visual studio
Esse não é um problema de última hora, mas eu gosto de limpar meu código de avisos, de modo que isso está me dando nos nervos.
Eu tenho usado a versão c ++ 11 do idioma pimpl para ocultar a implementação de classe da minha biblioteca da maneira usual.
// dll header
class FrameworkImpl;
class EXPORT_API Framework
{
Framework(const Framework&) = delete;
Framework& operator=(const Framework&) = delete;
Framework(Framework&&) = delete;
Framework& operator=(Framework&&) = delete;
public:
Framework();
~Framework();
private:
std::unique_ptr<FrameworkImpl> impl_;
};
// application implementation
int main()
{
std::unique_ptr<Framework> test = std::make_unique<Framework>();
}
Tudo vai ficar bem, mas continuarei recebendo o aviso:
warning C4251: 'Framework::impl_': class 'std::unique_ptr<FrameworkImpl,std::default_delete<_Ty>>' needs to have dll-interface to be used by clients of class 'Framework'
Então eu tentei adicionar:
template class EXPORT_API std::unique_ptr<FrameworkImpl>;
Antes da declaração de encaminhamento, mas o aviso mudaria apenas para:
warning C4251: 'std::_Unique_ptr_base<_Ty,_Dx>::_Mypair': class 'std::_Compressed_pair<_Dx,FrameworkImpl *,true>' needs to have dll-interface to be used by clients of class 'std::_Unique_ptr_base<_Ty,_Dx>'
Estou vendo esse problema desde o VS2010 e não consigo encontrar uma boa maneira de corrigir isso. Sem problemas no gcc ou no clang, e seria muito triste usar a versão antiga do ponteiro bruto.