invalid template instantiations
>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.
Reply to: