#if wxUSE_STRING_POS_CACHE
 
+#ifdef wxHAS_COMPILER_TLS
+
+wxTLS_TYPE(wxString::Cache) wxString::ms_cache;
+
+#else // !wxHAS_COMPILER_TLS
+
+struct wxStrCacheInitializer
+{
+    wxStrCacheInitializer()
+    {
+        // calling this function triggers s_cache initialization in it, and
+        // from now on it becomes safe to call from multiple threads
+        wxString::GetCache();
+    }
+};
+
+/*
+wxString::Cache& wxString::GetCache()
+{
+    static wxTLS_TYPE(Cache) s_cache;
+
+    return wxTLS_VALUE(s_cache);
+}
+*/
+
+static wxStrCacheInitializer gs_stringCacheInit;
+
+#endif // wxHAS_COMPILER_TLS/!wxHAS_COMPILER_TLS
+
 // gdb seems to be unable to display thread-local variables correctly, at least
 // not my 6.4.98 version under amd64, so provide this debugging helper to do it
 #ifdef __WXDEBUG__
 
 wxString::CacheStats wxString::ms_cacheStats;
 
-namespace
+struct wxStrCacheStatsDumper
 {
-
-struct ShowCacheStats
-{
-    ~ShowCacheStats()
+    ~wxStrCacheStatsDumper()
     {
         const wxString::CacheStats& stats = wxString::ms_cacheStats;
 
                    stats.lentot, 100.*float(stats.lenhits)/stats.lentot);
         }
     }
-} s_showCacheStats;
+};
 
-} // anonymous namespace
+static wxStrCacheStatsDumper s_showCacheStats;
 
 #endif // wxPROFILE_STRING_CACHE
 
 // wxCharBufferType<T>
 // ----------------------------------------------------------------------------
 
+#ifndef __VMS_BROKEN_TEMPLATES
 template<>
+#endif
 wxCharTypeBuffer<char>::Data
 wxCharTypeBuffer<char>::NullData(NULL);
 
+#ifndef __VMS_BROKEN_TEMPLATES
 template<>
+#endif
 wxCharTypeBuffer<wchar_t>::Data
 wxCharTypeBuffer<wchar_t>::NullData(NULL);