Here is the example program:
==========
// test.cxx
#include <algorithm>
#include <map>

namespace {
 template <class T>
 struct transformValue {
   size_t operator()(const T &x) const
   {
       return x + 10;
   }
 };
}

extern std::map<int, int, transformValue<int> > *test;
std::map<int, int, transformValue<int> > *test;
==========

If I compile this file with g++ 4.2 by the following command:
 g++ -c test.cxx
and then use this command to check symbol:
 nm test.o
I cannot find the global varible `test' in symbol table:
        U _ZNKSs4sizeEv
        U _ZNKSsixEj
00000000 t _ZSt17__verify_groupingPKcjRKSs
00000000 W _ZSt3minIjERKT_S2_S2_
        U __gxx_personality_v0

I can find the symbol `test' by using older version g++, such as g++ 4.1.x or 
3.x:
00000000 r _ZN9__gnu_cxx16__stl_prime_listE
        U _ZNKSs4sizeEv
        U _ZNKSsixEj
00000000 t _ZSt17__verify_groupingPKcjRKSs
00000000 W _ZSt3minIjERKT_S2_S2_
        U __gxx_personality_v0
00000000 B test

The keypoints of this problem are:
 1. struct transformValue<> is defined in anonymous namepsace
 2. transformValue<int> is passed to one of the template argument of std::map<> 
for instantiating it
 3. declare the global variable (should be a pointer) `test' as a external 
linkage object
 4. define the global varible `test' (should be a pointer)

If the variable `test' isn't declared/defined as pointer type, such as:
 extern std::map<int, int, transformValue<int> > test;
 std::map<int, int, transformValue<int> > test;
You can find a similar problem: the symbol `test' will become a `static' local 
variable.
It can be observed by using the tool `nm':
 00000000 b test
Its attribute must be `B', but became to `b'.

Reply via email to