Код ниже не компилируется на 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
Здравствуйте, 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
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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
К>Может быть, глючит 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
Вы не первый, кто страдает от подобной ошибки Борландского компилятора. Вот здесь вы можете почитать о схожей ситуации. Я вам советую задать ваш вопрос на форуме Embarcadero, на который я дал вам ссылку.
Пока что могу предложить попробовать явно указать аргумент шаблона. Может бытть это поможет?
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]