Я пытаюсь сделать простой пример шаблонного наследования, используя концепцию в качестве ограничения для подклассов (скомпилировано gcc с gnu2a и fconcepts). Я ожидал, что приведенный ниже пример прекрасно скомпилируется, но я не могу заставить его работать:
template<class structure>
concept bool Has_Type() {return requires{
typename structure::type;
};}
template<class sub> requires Has_Type<sub>()
struct structure {
//using type = typename sub::type;
};
struct child: structure<child> {
using type = child;
};
Концепция выдает ошибку, говоря, что typename structure::type would be ill-formed
. Я не понимаю, почему, поскольку у child есть тип, доступный оператору ::
. Я попробовал этот пример, чтобы убедиться, что сама идея верна, и это скомпилировано и работает нормально:
struct child {
using type = child;
};
template<class it>
auto func() {
typename it::type f = child();
return 0;
}
// in a test.cpp file
auto g = func<child>();
это заставляет меня думать, что идея поддерживается, поэтому я не уверен, почему эта концепция терпит неудачу. Кто-нибудь знает почему?