Я думаю, что нашел причину. Это то, что TR1 3.4/2
говорит о result_of<T(A1, A2, ..., AN)>::type
, используемом при определении типа возвращаемого reference_wrapper<T>::operator()
:
Реализация может определить элемент типа с помощью любых средств, которые производят точный тип выражения f (t1, t2, ..., tN) для данных типов. [Примечание: Цель состоит в том, что реализации разрешается использовать специальный компилятор Крючки -End примечание]
, а затем пункт 3:
Если F не является функцией объект, определенный в стандартной библиотеке, и если либо реализация не может определить тип выражения f (t1, t2, ..., tN), либо если выражение плохо сформировано, реализация должна использовать следующий процесс для определения элемента типа:
- Если F является, возможно, классом класса cv, без memb er по имени
result_type
или если typename F::result_type
не является типом:
- Если N = 0 (без аргументов), тип недействителен.
- Если N> 0, типа
typename F::template result<F(T1, T2,..., TN)>::type
Сообщение об ошибке артефакт пытается эти падения-спина. Предоставьте typedef для result_type
до int
, и он должен работать, я думаю. Обратите внимание, что в C++0x
это другое. Он не полагается на result_type
или на шаблон result
, так как он может использовать decltype
.
Если с <functional>
он терпит неудачу с MSVC10 в режиме C++ 0x, он будет пахнуть как ошибка, я бы сказал. Но, возможно, кто-то еще знает, что происходит. Он может (но не гарантирован) работать с <tr1/functional>
в режиме C++ 0x, если этот заголовок выбирает способ decltype
вместо ::result_type
. Я бы сделал typedef result_type
- так я думаю, что он всегда должен работать независимо от того, используется ли заголовок tr1
или заголовок c++0x
.
заметить также, что boost::tr1
говорит в своей документации, что он не поддерживает оператор вызова функции (но это только поддерживает неявное преобразование в T&
).
Как это не работает? – UncleBens
@litb: Я думаю, что OP имеет проблемы с использованием класса шаблонов 'std :: tr1 :: ref' и * not * boost на VS2010. – dirkgently
Вот выход сборки VS2010: http://pastebin.com/YQf4Qe8W –