Uploaded image for project: 'C++ Standard Library'
  1. C++ Standard Library
  2. STDCXX-613

[MSVC 8.0] static const data members violate the ODR

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: External
    • Labels:
      None
    • Environment:

      MSVC 7.0, 7.1, and 8.0

    • Regression:
      Regression
    • Severity:
      Linker Error

      Description

      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

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              sebor Martin Sebor
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated: