Copied from Rogue Wave Bugzilla:
http://bugzilla.cvo.roguewave.com/show_bug.cgi?id=1744
The program below illustrates that a definition of each static const integral data member of explicit specializations of class templates that are initialized in the body of the specialization is emitted by MSVC 7.0 in each translation unit that references the member. This is, of course, incorrect and leads to linker
errors.
$ cat t.cpp
template <class T>
struct S;
template <>
struct S<int>
{
static const int i = 0;
};
#ifndef MAIN
const int S<int>::i;
#else
int main ()
{
return S<int>::i;
}
#endif
$ cl -c -Fot.obj t.cpp && cl -c -DMAIN -Fomain.obj t.cpp && cl main.obj t.obj
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.00.9344.1 for 80x86
Copyright (C) Microsoft Corporation 1984-2001. All rights reserved.
...
t.obj : error LNK2005: "public: static int const S<int>::i" (?i@?$S@H@@2HB) already defined in main.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found
http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=b9853206-740a-47e7-af09-b03b51934a97
The program below illustrates that a definition of each static const
integral data member of explicit specializations of class templates
that are initialized in the body of the specialization is emitted by
MSVC 8.0 in each translation unit that references the member. This is
incorrect and leads to linker errors.
$ cat t.cpp && cl -c -Fot.obj t.cpp && cl -nologo -c -DMAIN
-Fomain.obj t.cpp && cl -nologo main.obj t.obj
template <class> struct S;
template <> struct S<int> { static const int i = 0; };
#ifndef MAIN
const int S<int>::i;
#else
int main () { return S<int>::i; }
#endif
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42
for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
t.cpp
t.cpp
t.obj : error LNK2005: "public: static int const S<int>::i"
(?i@?$S@H@@2HB) already defined in main.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found