editeng/source/items/textitem.cxx | 2 +- include/editeng/langitem.hxx | 10 +++++++++- include/svl/aeitem.hxx | 14 +++++++++++++- include/svl/eitem.hxx | 8 -------- svl/source/items/aeitem.cxx | 10 +++++----- svl/source/items/cenumitm.cxx | 3 --- 6 files changed, 28 insertions(+), 19 deletions(-)
New commits: commit 177f5c2e505b7978fc232a891577a448e49b290d Author: Stephan Bergmann <sberg...@redhat.com> Date: Sun Mar 5 13:19:41 2017 +0100 Proper fix for multiply defined SfxEnumItem<sal_uInt16> with MSVC With --disable-pch the original hack from f091259ad2ec1590714645839668580cd7b8c7c4 "convert SfxEnumItem to type-safe template class" doesn't happen to work: When linking sd, the occurrences of SfxEnumItem<sal_uInt16> in sd/inc/sdattr.hxx clash with those from editeng (where LanguageType is a typedef for sal_uInt16) and svl (as the respective include files from editeng and svl happen to not be included). For whatever reason, the explicit instantiation declaration without a __declspec(...) in include/svl/eitem.hxx doesn't seem to make a difference (at least with MSVC 2015 Update 3). Change-Id: I51b5943fe19a7184db9414192c6364f7c26b79eb Reviewed-on: https://gerrit.libreoffice.org/34903 Reviewed-by: Stephan Bergmann <sberg...@redhat.com> Tested-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/editeng/source/items/textitem.cxx b/editeng/source/items/textitem.cxx index 4cf3b83..2b62129 100644 --- a/editeng/source/items/textitem.cxx +++ b/editeng/source/items/textitem.cxx @@ -2345,7 +2345,7 @@ bool SvxEscapementItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) // class SvxLanguageItem ------------------------------------------------- SvxLanguageItem::SvxLanguageItem( const LanguageType eLang, const sal_uInt16 nId ) - : SfxEnumItem( nId , eLang ) + : SvxLanguageItem_Base( nId , eLang ) { } diff --git a/include/editeng/langitem.hxx b/include/editeng/langitem.hxx index e2ae3e8..81bbe05 100644 --- a/include/editeng/langitem.hxx +++ b/include/editeng/langitem.hxx @@ -32,7 +32,15 @@ class SvXMLUnitConverter; This item describes a Language. */ -class EDITENG_DLLPUBLIC SvxLanguageItem : public SfxEnumItem<LanguageType> +// MSVC hack: +class SvxLanguageItem_Base: public SfxEnumItem<LanguageType> { +protected: + explicit SvxLanguageItem_Base(sal_uInt16 nWhich, LanguageType nValue): + SfxEnumItem(nWhich, nValue) + {} +}; + +class EDITENG_DLLPUBLIC SvxLanguageItem : public SvxLanguageItem_Base { public: static SfxPoolItem* CreateDefault(); diff --git a/include/svl/aeitem.hxx b/include/svl/aeitem.hxx index ee38084..d203e23 100644 --- a/include/svl/aeitem.hxx +++ b/include/svl/aeitem.hxx @@ -26,7 +26,19 @@ class SfxAllEnumValueArr; -class SVL_DLLPUBLIC SfxAllEnumItem: public SfxEnumItem<sal_uInt16> +// MSVC hack: +class SfxAllEnumItem_Base: public SfxEnumItem<sal_uInt16> { +protected: + explicit SfxAllEnumItem_Base(sal_uInt16 nWhich, sal_uInt16 nValue): + SfxEnumItem(nWhich, nValue) + {} + + explicit SfxAllEnumItem_Base(sal_uInt16 const nWhich, SvStream & rStream): + SfxEnumItem(nWhich, rStream) + {} +}; + +class SVL_DLLPUBLIC SfxAllEnumItem: public SfxAllEnumItem_Base { SfxAllEnumValueArr* pValues; std::vector<sal_uInt16>* pDisabledValues; diff --git a/include/svl/eitem.hxx b/include/svl/eitem.hxx index 93c122b..49b9329 100644 --- a/include/svl/eitem.hxx +++ b/include/svl/eitem.hxx @@ -82,14 +82,6 @@ public: } }; -// We need to have this one instantiated only once to prevent LNK2005 "already defined" on 32-bit MSVC. -// But then we run into the problem that "extern" and SVL_DLLPUBLIC are mutually exclusive on templates for MSVC. -#ifdef _WIN32 -extern template class SfxEnumItem<sal_uInt16>; -#else -extern template class SVL_DLLPUBLIC SfxEnumItem<sal_uInt16>; -#endif - class SVL_DLLPUBLIC SfxBoolItem : public SfxPoolItem { diff --git a/svl/source/items/aeitem.cxx b/svl/source/items/aeitem.cxx index 00c6149..b10b36d 100644 --- a/svl/source/items/aeitem.cxx +++ b/svl/source/items/aeitem.cxx @@ -35,14 +35,14 @@ class SfxAllEnumValueArr : public std::vector<SfxAllEnumValue_Impl> {}; SfxAllEnumItem::SfxAllEnumItem() : - SfxEnumItem<sal_uInt16>(0, 0), + SfxAllEnumItem_Base(0, 0), pValues( nullptr ), pDisabledValues( nullptr ) { } SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which, sal_uInt16 nVal): - SfxEnumItem(which, nVal), + SfxAllEnumItem_Base(which, nVal), pValues( nullptr ), pDisabledValues( nullptr ) { @@ -50,7 +50,7 @@ SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which, sal_uInt16 nVal): } SfxAllEnumItem::SfxAllEnumItem( sal_uInt16 which, SvStream &rStream ): - SfxEnumItem(which, rStream), + SfxAllEnumItem_Base(which, rStream), pValues( nullptr ), pDisabledValues( nullptr ) { @@ -58,14 +58,14 @@ SfxAllEnumItem::SfxAllEnumItem( sal_uInt16 which, SvStream &rStream ): } SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which): - SfxEnumItem(which, 0), + SfxAllEnumItem_Base(which, 0), pValues( nullptr ), pDisabledValues( nullptr ) { } SfxAllEnumItem::SfxAllEnumItem(const SfxAllEnumItem &rCopy): - SfxEnumItem(rCopy), + SfxAllEnumItem_Base(rCopy), pValues(nullptr), pDisabledValues( nullptr ) { diff --git a/svl/source/items/cenumitm.cxx b/svl/source/items/cenumitm.cxx index 8e91217..33b7853 100644 --- a/svl/source/items/cenumitm.cxx +++ b/svl/source/items/cenumitm.cxx @@ -101,9 +101,6 @@ bool SfxEnumItemInterface::GetBoolValue() const void SfxEnumItemInterface::SetBoolValue(bool) {} - -template class SfxEnumItem<sal_uInt16>; - SfxPoolItem* SfxBoolItem::CreateDefault() { return new SfxBoolItem(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits