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

Reply via email to