Ваш заказ неверный. Попробуйте обменять его
template <>
class A<void>
{
void f();
typedef decltype(std::bind(&A::f, std::declval<A>())) some_type;
};
В первичном шаблоне имя A::f
было зависимым, и компилятор отложил поиск до точки, где было объявлено f
(A::f
больше не зависит от C ++ 0x, поскольку A
относится к текущая реализация и, следовательно, f
члену текущей реализации, но, поскольку в текущей спецификации есть лазейка (это связано с зависимыми базовыми классами), компилятор тем не менее задержал поиск). В явной специализации имя не зависит, и поиск выполняется немедленно, поэтому вам нужно объявить f
, прежде чем ссылаться на него.
Редактировать: Вы неправильно используете std::bind
. Второй аргумент, который вы даете, имеет тип A<void>
, который std::bind
будет скопирован / перемещен в созданный объект оболочки вызова. Для этого требуется полный тип A<void>
.
Если вы хотите просто передать ссылку на A
, для которой вызывается функция-член, вы можете передать declval<A*>()
, который механизм std::bind
одинаково обнаружит как магический первый аргумент для вызова указателя на член.
Но мне кажется, что вы хотите изучить std::function<>
, вместо того, чтобы делать беспорядок std::bind
и decltype
. В конце концов, у вас есть мощный набор инструментов, но, используя сомнительное выражение decltype
, вы отбрасываете всю универсальность, которую дает вам стандартная библиотека, и ограничиваетесь использованием этого единственного выражения std::bind
. Это не хорошо.