Embarcadero, template member function overload
От: roofhasgone  
Дата: 07.09.12 12:05
Оценка: :))
Код ниже не компилируется на Embarcadero C++ Builder XE2.
На MSVS 2010 компилируется и работает как надо.
Вопрос в том, как добиться такой же работы на Embarcadero.
Если за комментировать первое определение Func, то, естественно, работает. Получается, что
это объявление скрывает второе.


#include <type_traits>

void Foo(int x) {

};

class Bar {
public:
    template<typename T, typename F>
    typename std::enable_if<std::is_class<T>::value,void>::type
    Func(T *obj, F func) {

    }

    template<typename F, typename A>
    void Func(F func, A arg) {

    }
} bar;

int _tmain(int argc, _TCHAR* argv[])
{
    bar.Func(&Foo,10); // [BCC32 Error] E2285 Could not find a match for 'Bar::Func<T,F>(void (*)(int),int)'

    return 0;
}
Re: Embarcadero, template member function overload
От: uzhas Ниоткуда  
Дата: 07.09.12 12:14
Оценка: :))
Здравствуйте, roofhasgone, Вы писали:

R>Вопрос в том, как добиться такой же работы на Embarcadero.


ахтунг! Борланд жив!
Re: Embarcadero, template member function overload
От: Кодт Россия  
Дата: 07.09.12 13:54
Оценка:
Здравствуйте, roofhasgone, Вы писали:

R>Код ниже не компилируется на Embarcadero C++ Builder XE2.


Может быть, глючит std::is_class?
(Проверь, что даёт is_class<Foo>::value)

Если да, — то решение такое: выдрать, если получится, определение из VC-шной реализации STL и вставить к себе в проект. А чтобы не подрались имена — запихнуть в пространство vcstd::

Если нет, то есть, компилятор не умеет делать SFINAE, — тогда всё гораздо хуже.

Придётся переосмыслить свой код. В частности: почему в одной сигнатуре идёт &obj,func, а в другой — func,arg? Логично было бы, чтоб функция оказывалась всегда на одном и том же месте, например, на первом.
Далее, подозреваю, что &obj,func нужно, чтобы сделать замыкание функции на объект. Как насчёт того, чтобы для этих целей использовать std::bind? Уж bind-то не глючит, надеюсь.
Перекуём баги на фичи!
Re[2]: Embarcadero, template member function overload
От: denisko http://sdeniskos.blogspot.com/
Дата: 07.09.12 14:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, roofhasgone, Вы писали:


R>>Код ниже не компилируется на Embarcadero C++ Builder XE2.


К>Может быть, глючит std::is_class?

К>(Проверь, что даёт is_class<Foo>::value)

К>Если да, — то решение такое: выдрать, если получится, определение из VC-шной реализации STL и вставить к себе в проект. А чтобы не подрались имена — запихнуть в пространство vcstd::


К>Если нет, то есть, компилятор не умеет делать SFINAE, — тогда всё гораздо хуже.


SFINAE вроде даже 6 билдер умел делать, врядли комплиятор разучился.
<Подпись удалена модератором>
Re[2]: Embarcadero, template member function overload
От: roofhasgone  
Дата: 10.09.12 09:56
Оценка:
К>Может быть, глючит std::is_class?
К>(Проверь, что даёт is_class<Foo>::value)

Все штуки из std::is_* работают(по крайней мере, по отдельности )

К>Если нет, то есть, компилятор не умеет делать SFINAE, — тогда всё гораздо хуже.


К>Придётся переосмыслить свой код. В частности: почему в одной сигнатуре идёт &obj,func, а в другой — func,arg? Логично было бы, чтоб функция оказывалась всегда на одном и том же месте, например, на первом.

К>Далее, подозреваю, что &obj,func нужно, чтобы сделать замыкание функции на объект. Как насчёт того, чтобы для этих целей использовать std::bind? Уж bind-то не глючит, надеюсь.

SFINAE тоже работает в других местах. Более того, аналогичные перегрузки, но с другими наборами параметров и условиями, тоже работают.
Подобные ошибки возникают только в каких-то "особенных" конкретных случаях.
Ох, и наелся я гвоздей с этими потомками Borland'а... Выйду из положения, отказавшись от перегрузки в пользу двух отдельных функций.
Re: Embarcadero, template member function overload
От: Сыроежка  
Дата: 11.09.12 00:07
Оценка:
Вы не первый, кто страдает от подобной ошибки Борландского компилятора. Вот здесь вы можете почитать о схожей ситуации. Я вам советую задать ваш вопрос на форуме Embarcadero, на который я дал вам ссылку.

Пока что могу предложить попробовать явно указать аргумент шаблона. Может бытть это поможет?

bar.Func<void ( * )( int )>(&Foo,10);
Меня можно встретить на www.cpp.forum24.ru
Re[2]: Embarcadero, template member function overload
От: trophim Россия  
Дата: 11.09.12 18:22
Оценка:
вот это "( * )" как бы символично указывает на то, что.... получится полная... в смысле компилятор будет сопротивляться до последнего!
... << RSDN@Home 1.2.0 alpha 5 rev. 43>>
Let it be! — Давайте есть пчелу!
Re[3]: Embarcadero, template member function overload
От: Vain Россия google.ru
Дата: 11.09.12 19:29
Оценка:
Здравствуйте, roofhasgone, Вы писали:

К>>Может быть, глючит std::is_class?

К>>(Проверь, что даёт is_class<Foo>::value)
R>Все штуки из std::is_* работают(по крайней мере, по отдельности )
прочитал как "все шутки" и задумался..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.