[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: