У меня есть следующий сценарий: -декларация вперед класса с шаблоном, используя имя типа
template<typename Derived, typename ValType>
class foo
{
public:
template<typename R>
bar<typename std::vector<R>::const_iterator> select()
{
std::vector<R> translation;
return bar<typename std::vector<R>::const_iterator>(std::move(translation));
}
};
template<typename T>
class bar
: public foo<bar<T>, typename std::iterator_traits<T>::value_type>
{
public:
bar(std::vector<typename std::iterator_traits<T>::value_type>&& vec)
{
}
};
Это в основном немного доказательство концепции я играю с помощью CRTP с Foo быть Mixin.
Проблема заключается в том, что я считаю, что я должен использовать опережающее объявление однако я попытался следующие: -
class bar; // I didn't expect this to work
однако я ожидаю, что это работает: -
template<typename R>
class bar;
который компилирует штраф, пока я на самом деле не позвоню select()
std::vector<int> enumerable_vector;
enumerable_vector.push_back(1);
enumerable_vector.push_back(2);
bar<typename std::vector<int>::const_iterator> baz(std::move(enumerable_vector));
baz.select<std::string>();
который приводит к следующей ошибке: -
Error error C2027: use of undefined type 'foo::bar'
Любая помощь была бы признательна, спасибо!
Он отлично работает с GCC и [Clang] (http://coliru.stacked-crooked.com/a/5244a59ca673d26c) дал опережающее объявление, что вы должны работать. –
@ Daniel Frey Вы вызываете select() на baz? – chrisw
Да, просто нажмите ссылку в моем комментарии. –