#include <iostream>
#include <string>
#include <iomanip>
template <typename CharT>
void test() {
struct Destructible_ctype : public std::ctype<CharT>
{
Destructible_ctype(std::size_t refs = 0) {}
// note: the implicit destructor is public
} dc;
{
std::basic_ostringstream<CharT> oss;
oss << 123;
std::cerr << oss.str().size() << std::endl;
}
{
std::basic_ostringstream<CharT> oss;
oss << 1234.56;
std::cerr << oss.str().size() << std::endl;
}
{
std::basic_ostringstream<CharT> oss;
oss << std::setfill(CharT(' '));
// oss << 123;
std::cerr << oss.str().size() << std::endl;
}
}
int main()
{
std::cerr << "char:" << std::endl;
test<char>();
std::cerr << std::endl;
std::cerr << "wchar_t:" << std::endl;
test<wchar_t>();
std::cerr << std::endl;
std::cerr << "char32_t:" << std::endl;
test<char32_t>();
std::cerr << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9tYW5pcD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVD4Kdm9pZCB0ZXN0KCkgewoJc3RydWN0IERlc3RydWN0aWJsZV9jdHlwZSA6IHB1YmxpYyBzdGQ6OmN0eXBlPENoYXJUPgogICAgewogICAgICBEZXN0cnVjdGlibGVfY3R5cGUoc3RkOjpzaXplX3QgcmVmcyA9IDApIHt9CiAgICAgIC8vIG5vdGU6IHRoZSBpbXBsaWNpdCBkZXN0cnVjdG9yIGlzIHB1YmxpYwogICAgfSBkYzsKCQoJewoJCXN0ZDo6YmFzaWNfb3N0cmluZ3N0cmVhbTxDaGFyVD4gb3NzOwoJCW9zcyA8PCAxMjM7CgkJc3RkOjpjZXJyIDw8IG9zcy5zdHIoKS5zaXplKCkgPDwgc3RkOjplbmRsOwoJfQoJewoJCXN0ZDo6YmFzaWNfb3N0cmluZ3N0cmVhbTxDaGFyVD4gb3NzOwoJCW9zcyA8PCAxMjM0LjU2OwoJCXN0ZDo6Y2VyciA8PCBvc3Muc3RyKCkuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKCX0KCXsKCQlzdGQ6OmJhc2ljX29zdHJpbmdzdHJlYW08Q2hhclQ+IG9zczsKCQlvc3MgPDwgc3RkOjpzZXRmaWxsKENoYXJUKCcgJykpOwoJCS8vIG9zcyA8PCAxMjM7CgkJc3RkOjpjZXJyIDw8IG9zcy5zdHIoKS5zaXplKCkgPDwgc3RkOjplbmRsOwoJfQp9CgppbnQgbWFpbigpCnsKCXN0ZDo6Y2VyciA8PCAiY2hhcjoiIDw8IHN0ZDo6ZW5kbDsKCXRlc3Q8Y2hhcj4oKTsKCXN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNlcnIgPDwgIndjaGFyX3Q6IiA8PCBzdGQ6OmVuZGw7Cgl0ZXN0PHdjaGFyX3Q+KCk7CglzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOwoJc3RkOjpjZXJyIDw8ICJjaGFyMzJfdDoiIDw8IHN0ZDo6ZW5kbDsKCXRlc3Q8Y2hhcjMyX3Q+KCk7CglzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOwp9
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o: in function `test<char32_t>()::Destructible_ctype::~Destructible_ctype()':
prog.cpp:(.text._ZZ4testIDiEvvEN18Destructible_ctypeD2Ev[_ZZ4testIDiEvvEN18Destructible_ctypeD5Ev]+0xb): undefined reference to `std::ctype<char32_t>::~ctype()'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o: in function `test<char32_t>()::Destructible_ctype::~Destructible_ctype()':
prog.cpp:(.text._ZZ4testIDiEvvEN18Destructible_ctypeD0Ev[_ZZ4testIDiEvvEN18Destructible_ctypeD5Ev]+0xf): undefined reference to `std::ctype<char32_t>::~ctype()'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o: in function `void test<char32_t>()':
prog.cpp:(.text._Z4testIDiEvv[_Z4testIDiEvv]+0x8ea): undefined reference to `std::ctype<char32_t>::~ctype()'
/usr/bin/ld: prog.cpp:(.text._Z4testIDiEvv[_Z4testIDiEvv]+0xb2c): undefined reference to `std::ctype<char32_t>::~ctype()'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x20): undefined reference to `std::ctype<char32_t>::do_is(unsigned short, char32_t) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x28): undefined reference to `std::ctype<char32_t>::do_is(char32_t const*, char32_t const*, unsigned short*) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x30): undefined reference to `std::ctype<char32_t>::do_scan_is(unsigned short, char32_t const*, char32_t const*) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x38): undefined reference to `std::ctype<char32_t>::do_scan_not(unsigned short, char32_t const*, char32_t const*) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x40): undefined reference to `std::ctype<char32_t>::do_toupper(char32_t) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x48): undefined reference to `std::ctype<char32_t>::do_toupper(char32_t*, char32_t const*) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x50): undefined reference to `std::ctype<char32_t>::do_tolower(char32_t) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x58): undefined reference to `std::ctype<char32_t>::do_tolower(char32_t*, char32_t const*) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x60): undefined reference to `std::ctype<char32_t>::do_widen(char) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x68): undefined reference to `std::ctype<char32_t>::do_widen(char const*, char const*, char32_t*) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x70): undefined reference to `std::ctype<char32_t>::do_narrow(char32_t, char) const'
/usr/bin/ld: /home/ZV5zzb/ccuvaQdQ.o:(.data.rel.ro._ZTVZ4testIDiEvvE18Destructible_ctype[_ZTVZ4testIDiEvvE18Destructible_ctype]+0x78): undefined reference to `std::ctype<char32_t>::do_narrow(char32_t const*, char32_t const*, char, char*) const'
collect2: error: ld returned 1 exit status