Выбрана неверная перегрузка для потокового манипулятора

Вот код:

#include <iostream>
#include <iomanip>
#include <typeinfo>

#if 0
std::ostream &foo(std::ostream &os, std::ios_base &(*x)(std::ios_base &), bool show_id = false)
{
if ( show_id )
os << "(" << typeid(x).name() << ") ";
return os << x;
}
#endif

template<typename T>
std::ostream &foo(std::ostream &os, T const &t, bool show_id = false)
{
if ( show_id )
os << "(" << typeid(t).name() << ") ";

return os << t;
}

int main()
{
foo(std::cout, std::hex) << 255 << std::endl;
foo(std::cout, ".") << std::hex << 255 << std::dec << std::endl;

foo(std::cout, std::hex, true) << 255 << std::endl;
}

Используя bcc32 6.70 и bcc32 5.82, вывод

401358255
.ff
(std::ios_base & (*)(std::ios_base &) const) 401368255

Используя bcc64 6.70 (на основе clang) и g ++ 4.8.2, вывод

ff
.ff
(FRSt8ios_baseS0_E) ff

Я предполагаю, что clang и gcc верны, потому что у них лучшая репутация, чем у bcc32.

Если я включаю закомментированную функцию, то bcc32 выводит:

ff
.ff
(std::ios_base & (*)(std::ios_base &)) ff

Что именно не так с первой версией? Вероятно, это ошибка компилятора, связанная с разрешением перегрузки, но я не могу понять, что делает bcc32 или что const находится на конце typeid выход.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]