[Libreoffice-commits] core.git: editeng/source include/editeng include/svl svl/source
Stephan Bergmann
sbergman at redhat.com
Sun Mar 5 15:11:12 UTC 2017
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 <sbergman at 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 <sbergman at redhat.com>
Tested-by: Stephan Bergmann <sbergman at 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();
More information about the Libreoffice-commits
mailing list