>Submitter-Id: net >Originator: Matt Kern >Organization: none >Confidential: no >Synopsis: invalid template instantiations >Severity: serious >Priority: medium >Category: c++ >Class: rejects-legal >Release: 3.3 (Debian) (Debian testing/unstable) >Environment: System: Linux xanadu 2.4.20pre7int #1 SMP Thu Nov 14 17:17:34 GMT 2002 i686 GNU/Linux Architecture: i686 host: i386-pc-linux-gnu build: i386-pc-linux-gnu target: i386-pc-linux-gnu configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i386-linux >Description: I am having problems manually instantiating some template functions.
>How-To-Repeat: I can compile the following code into an executable with no problems: g++-3.3 test.cpp -o test If I attempt to compile with -fno-implicit-templates it will obviously throw up missing symbols: g++-3.3 test.cpp -o test -fno-implicit-templates I repeatedly instantiated those symbols to give the template lines in the code below. The problem is in the macro-ed out line. If you define this on the compile line it throws up: test.cpp:31: error: template-id ` fill_n<__gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*> >**, unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*> >*>' for `__gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*> >** fill_n(__gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*> >*, unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*> >* const&)' does not match any template declaration This is despite the fact that the instantiation is basically cut and pasted from a diff of the missing symbols on a partial compile (no link): g++-3.3 test.cpp -c -o test1.o g++-3.3 test.cpp -c -o test2.o -fno-implicit-templates nm --demangle test1.o >a nm --demangle test2.o >b diff a b 116c116 < U __gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >** std::fill_n<__gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >**, unsigned, __gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >*>(__gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >*, unsigned, __gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >* const&) --- > 00000000 W __gnu_cxx::_Hashtable_node<std::pair<char const* const, > TestClass*> >** std::fill_n<__gnu_cxx::_Hashtable_node<std::pair<char const* > const, TestClass*> >**, unsigned, __gnu_cxx::_Hashtable_node<std::pair<char > const* const, TestClass*> >*>(__gnu_cxx::_Hashtable_node<std::pair<char > const* const, TestClass*> >*, unsigned, > __gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >* const&) ==================== CODE BEGINS ==================== #include <typeinfo> #include <ext/hash_map> using namespace std; using namespace __gnu_cxx; class TestClass; int main () { hash_map<const char*, TestClass*> M; M["testing"] = 0; return 0; } template pair<char const* const, TestClass*>& hashtable<pair<char const* const, TestClass*>, char const*, hash<char const*>, _Select1st<pair<char const* const, TestClass*> >, equal_to<char const*>, allocator<TestClass*> >::find_or_insert(pair<char const* const, TestClass*> const&); template void hashtable<pair<char const* const, TestClass*>, char const*, hash<char const*>, _Select1st<pair<char const* const, TestClass*> >, equal_to<char const*>, allocator<TestClass*> >::resize(unsigned); template void vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> >::reserve(unsigned); template void vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> >::_M_fill_insert(__normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > >, unsigned, _Hashtable_node<pair<char const* const, TestClass*> >* const&); template void fill<__normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > >, _Hashtable_node<pair<char const* const, TestClass*> >*>(__normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > >, __normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > >, _Hashtable_node<pair<char const* const, TestClass*> >* const&); template void hashtable<pair<char const* const, TestClass*>, char const*, hash<char const*>, _Select1st<pair<char const* const, TestClass*> >, equal_to<char const*>, allocator<TestClass*> >::clear(); #ifdef STOP_WORKING template _Hashtable_node<pair<char const* const, TestClass*> >** fill_n<_Hashtable_node<pair<char const* const, TestClass*> >**, unsigned, _Hashtable_node<pair<char const* const, TestClass*> >*>(_Hashtable_node<pair<char const* const, TestClass*> >*, unsigned, _Hashtable_node<pair<char const* const, TestClass*> >* const&); #endif template __normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > > fill_n<__normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > >, unsigned, _Hashtable_node<pair<char const* const, TestClass*> >*>(__normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, allocator<TestClass*> > >, unsigned, _Hashtable_node<pair<char const* const, TestClass*> >* const&); template unsigned long const* lower_bound<unsigned long const*, unsigned long>(unsigned long const*, unsigned long const*, unsigned long const&); ==================== CODE END ==================== >Fix: None.