Но выдается ошибка при компиляции
'operator<<' not implemented in type 'std::ostream' for arguments of type 'T2'
Компилятор bcc 5.5.1
То есть он, скорей всего, определяет что T2 это тип конкретного объекта, а не параметер шаблона
Как исправить?
Может есть обходные пути?
Здравствуйте, Sergey, Вы писали:
S>Параметр T1 придется задать руками, параметр T2 будет выведен из аргументов.
Ты прав, но при желании можно извратиться (если предположить, что подопытная func — это boost::lexical_cast):
Здравствуйте, CrystaX, Вы писали:
CX>Я не на свое сообщение линк дал, а на то, которое тебе было "искать лень". CX>Первоисточник, так сказать.
Понял уже , удалить не успел. Иногда и ссылки открывать лень (что характерно, при этом не лень писать ответы, каюсь ).
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Здравствуйте, Sergey, Вы писали:
S>>Параметр T1 придется задать руками, параметр T2 будет выведен из аргументов. ГА>Ты прав, но при желании можно извратиться (если предположить, что подопытная func — это boost::lexical_cast):
Вы правы это lexical_cast, правда только не из boost, а от Герба Саттера-а.(откуда он её взял интересно?)
Только вопрос, почему же компилятор для одного шаблонного параметра может вывести аргумент, а для двух нет?
double f=func<>(string("1.2")); //Ok используется перегрузка с одним параметром
string str=func<>(string(1.2)) //error используется шаблон с двумя параметрами.
Здравствуйте, Sergei, Вы писали:
S>Вы правы это lexical_cast, правда только не из boost, а от Герба Саттера-а.(откуда он её взял интересно?)
Из boost. Почитай внимательно, он об этом пишет в книге.
S>Только вопрос, почему же компилятор для одного шаблонного параметра может вывести аргумент, а для двух нет?
S>
S>double f=func<>(string("1.2")); //Ok используется перегрузка с одним параметром
S>string str=func<>(string(1.2)) //error используется шаблон с двумя параметрами.
S>
Компилятор может вывести тип только из типов аргументов, но не из типа объекта, которому присваивается результат.
В твоем случае типом аргумента является T2, а T1 — тип возвращаемого значения, поэтому T1 выводится, а T2 нет. Вот, кстати, код для пояснения:
void foo(int );
void foo(double );
template <typename T1, typename T2>
T1 func(T2 const &val);
int x = 1;
foo(func(x)); // Что здесь вызывать? foo(int ) или foo(double)?
Здравствуйте, CrystaX, Вы писали:
CX>Здравствуйте, Sergei, Вы писали:
S>>Вы правы это lexical_cast, правда только не из boost, а от Герба Саттера-а.(откуда он её взял интересно?)
CX>Из boost. Почитай внимательно, он об этом пишет в книге.