]> www.ginac.de Git - ginac.git/commitdiff
Work around a compiler bug on MSVC.
authorJan Rheinländer <jrheinlaender@gmx.de>
Wed, 16 Feb 2022 22:57:36 +0000 (23:57 +0100)
committerRichard Kreckel <kreckel@ginac.de>
Wed, 16 Feb 2022 23:07:08 +0000 (00:07 +0100)
The two 'reg_info' declarations introduced in f271f67d2f turned out
to confuse MSVC: It thinks that these declarations are definitions
and then complains about a missing default ctor (error C2512) and
about duplicate definitions later in the .cpp files (error C2766).

But the standard says in [temp.expl.spec] §13:
An explicit specialization of a static data member of a template or
an explicit specialization of a static  data member template is a
definition if the declaration includes an initializer; otherwise, it
is a declaration. [Note: The definition of a static data member of a
template that requires default-initialization must use a braced-init-
list:
    template<> X Q<int>::x;     // declaration
    template<> X Q<int>::x ();  // error: declares a function
    template<> X Q<int>::x { }; // definition
--end note]
There is no initializer at lst.h:35 and at exprseq.h:35. Hence, this
is merely a declaration and the compiler's error message is wrong.
Let's work around by #ifndef'ing the two lines for silly MSVC.

ginac/exprseq.h
ginac/lst.h

index dea1e38eb1127f35563750a1460df0daa7adc8e1..ce78aae90b9637edcca2b3bd8212c9ebb1c5c480 100644 (file)
@@ -32,7 +32,9 @@ namespace GiNaC {
 typedef container<std::vector> exprseq;
 
 /** Declaration of container::reg_info for exprseq. */
+#ifndef _MSC_VER  // workaround error C2766: explicit specialization; 'reg_info' has already been defined
 template<> registered_class_info exprseq::reg_info;
+#endif
 
 // defined in exprseq.cpp
 template<> bool exprseq::info(unsigned inf) const;
index 6b047c69982deb0f597866a210570ea8e9e998b8..1dae29ee9b4cdbae3aa87c1b47e406d6913b0d55 100644 (file)
@@ -32,7 +32,9 @@ namespace GiNaC {
 typedef container<std::list> lst;
 
 /** Declaration of container::reg_info for lst. */
+#ifndef _MSC_VER  // workaround error C2766: explicit specialization; 'reg_info' has already been defined
 template<> registered_class_info lst::reg_info;
+#endif
 
 /** Specialization of container::get_default_flags() for lst. */
 template<> inline unsigned lst::get_default_flags() { return status_flags::not_shareable; }