Source code for a.cpp --------------------------------------- #include <locale>
struct mystruct : public std::ctype<unsigned char> { unsigned char my_do_tolower(unsigned char ch) const { return (do_tolower(ch)); } }; int main() { int rc = 0; mystruct structA; if (structA.my_do_tolower('A') != 'a') rc++; return rc; } --------------------------------------- Actual Output: /tmp/cc8bTl0c.o(.gnu.linkonce.t._ZN8mystructD1Ev+0x2c): In function `mystruct::~mystruct [in-charge]()': : undefined reference to `std::ctype<unsigned char>::~ctype [not-in-charge]()' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x10): undefined reference to `std::ctype<unsigned char>::do_is(unsigned short, unsigned char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x14): undefined reference to `std::ctype<unsigned char>::do_is(unsigned char const*, unsigned char const*, unsigned short*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x18): undefined reference to `std::ctype<unsigned char>::do_scan_is(unsigned short, unsigned char const*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x1c): undefined reference to `std::ctype<unsigned char>::do_scan_not(unsigned short, unsigned char const*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x20): undefined reference to `std::ctype<unsigned char>::do_toupper(unsigned char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x24): undefined reference to `std::ctype<unsigned char>::do_toupper(unsigned char*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x28): undefined reference to `std::ctype<unsigned char>::do_tolower(unsigned char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x2c): undefined reference to `std::ctype<unsigned char>::do_tolower(unsigned char*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x30): undefined reference to `std::ctype<unsigned char>::do_widen(char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x34): undefined reference to `std::ctype<unsigned char>::do_widen(char const*, char const*, unsigned char*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x38): undefined reference to `std::ctype<unsigned char>::do_narrow(unsigned char, char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTV8mystruct+0x3c): undefined reference to `std::ctype<unsigned char>::do_narrow(unsigned char const*, unsigned char const*, char, char*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x8): undefined reference to `std::ctype<unsigned char>::~ctype [in-charge]()' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0xc): undefined reference to `std::ctype<unsigned char>::~ctype [in-charge deleting]()' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x10): undefined reference to `std::ctype<unsigned char>::do_is(unsigned short, unsigned char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x14): undefined reference to `std::ctype<unsigned char>::do_is(unsigned char const*, unsigned char const*, unsigned short*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x18): undefined reference to `std::ctype<unsigned char>::do_scan_is(unsigned short, unsigned char const*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x1c): undefined reference to `std::ctype<unsigned char>::do_scan_not(unsigned short, unsigned char const*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x20): undefined reference to `std::ctype<unsigned char>::do_toupper(unsigned char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x24): undefined reference to `std::ctype<unsigned char>::do_toupper(unsigned char*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x28): undefined reference to `std::ctype<unsigned char>::do_tolower(unsigned char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x2c): undefined reference to `std::ctype<unsigned char>::do_tolower(unsigned char*, unsigned char const*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x30): undefined reference to `std::ctype<unsigned char>::do_widen(char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x34): undefined reference to `std::ctype<unsigned char>::do_widen(char const*, char const*, unsigned char*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x38): undefined reference to `std::ctype<unsigned char>::do_narrow(unsigned char, char) const' /tmp/cc8bTl0c.o(.gnu.linkonce.r._ZTVSt5ctypeIhE+0x3c): undefined reference to `std::ctype<unsigned char>::do_narrow(unsigned char const*, unsigned char const*, char, char*) const' /tmp/cc8bTl0c.o(.gnu.linkonce.t._ZN8mystructD0Ev+0x2c): In function `mystruct::~mystruct [in-charge deleting]()': : undefined reference to `std::ctype<unsigned char>::~ctype [not-in-charge]()' collect2: ld returned 1 exit status Release: gcc version 3.3.3 (SuSE Linux) Environment: Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local- prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable- languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable- libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with- system-zlib --enable-shared --enable-__cxa_atexit --host=powerpc-suse-linux -- build=powerpc-suse-linux --target=powerpc-suse-linux --enable-targets=powerpc64- suse-linux --enable-biarch Thread model: posix gcc version 3.3.3 (SuSE Linux) How to repeat: g++ a.cpp -- Summary: link error calling do_tolower using template type unsigned char Product: gcc Version: 3.3.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: vwktsang at ca dot ibm dot com CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19646