Это не проблема, но мне нравится очищать свой код от предупреждений, так что это нервничает.
Я использую версию pimpl для С++ 11, чтобы скрыть реализацию класса для моей библиотеки обычным способом.
// 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>();
}
Все будет хорошо, но я буду получать предупреждение:
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'
Итак, я попытался добавить:
template class EXPORT_API std::unique_ptr<FrameworkImpl>;
Перед объявлением вперед, но предупреждение просто изменится на:
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>'
Я рассматриваю этот вопрос со времен VS2010, и я не могу понять, как это исправить. Никаких проблем с gcc или clang, и это сломало бы мое сердце, чтобы использовать старую версию исходного указателя.