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.
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;
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; }