В контексте приложения C++14 я использую схему, которую можно продолжить следующим образом (минимальный воспроизводимый тест):
template <class Container>
struct LocateFunctions {
auto get_it() const // <-- here is the problem
{
auto ret = typename Container::Iterator();
return ret;
}
};
template <typename T>
struct A : public LocateFunctions<A<T>> {
struct Iterator {};
};
int main() {
A<int> a;
}
Этот подход отлично компилируется и работает в C++14 с компиляторами GCC и Clang.
Теперь я хочу перенести свое приложение на Windows, и для этого я использую MinGW. К сожалению, его последняя версия содержит GCC 4.9, который не компилирует C++14. Это не кажется серьезной проблемой, потому что я могу переписать конструкции C++14 на C++11. Итак, я переписываю метод get_it() следующим образом:
typename Container::Iterator get_it() const
{
auto ret = typename Container::Iterator();
return ret;
}
К сожалению, он не компилируется. Оба компилятора выдают следующую ошибку:
error: no type named ‘Iterator’ in ‘struct A<int>’
typename Container::Iterator get_it() const
^
Я также пробовал:
auto get_it() const -> decltype(typename Container::Iterator())
{
auto ret = typename Container::Iterator();
return ret;
}
но я получаю точно такую же ошибку.
Поскольку два компилятора не могут распознать тип возврата, я полагаю, что определить его невозможно. Но я действительно не знаю, почему.
Может кто-нибудь объяснить мне, почему бы не скомпилировать и, в конечном итоге, способ рефакторинга в С++ 11, который компилируется?