Рассмотрим:
template < typename Something >
boost::function<void()> f()
{
typedef typename Something::what type;
return [](){};
}
В этом коде вам нужно имя типа, потому что «что» является зависимым именем. Но учтите это:
template < typename Something >
boost::function<void()> f()
{
return []()
{
typedef typename Something::what type;
};
}
Суки компилятора: "typename нельзя использовать вне объявления шаблона"
WTF?
ЭТО работает:
template < typename Something >
boost::function<void()> f()
{
return []()
{
typedef Something::what type;
};
}
Что такое создание лямбды, что означает "что" больше не является зависимым именем? Или это просто ошибка?
Хех ... коррекция. Последний не работает. Он говорит, что «Нечто» не существует. Эта модифицированная версия работает, хотя и по-прежнему не нуждается в ней и не принимает "typename".
template < typename T > struct wtf { typedef typename T::what type; };
template < typename Something >
boost::function<void()> f()
{
return []() { typedef wtf<Something>::type type; };
}
Конечно, теперь у меня есть ДВА вопроса: оригинал и WTF не находит "Нечто", если он не используется в качестве параметра шаблона ??