TS Concepts ограничение типа имени - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь сделать простой пример шаблонного наследования, используя концепцию в качестве ограничения для подклассов (скомпилировано 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>();

это заставляет меня думать, что идея поддерживается, поэтому я не уверен, почему эта концепция терпит неудачу. Кто-нибудь знает почему?

1 Ответ

0 голосов
/ 01 июля 2018

Это потому, что child является неполным в этой точке. [class.mem] p6 говорит:

Класс считается полностью определенным типом объекта (6.7) (или полным типом) при закрытии} класса спецификатор.

За этим следует несколько исключений (например, не в функциях-членах). Но в базовом предложении он неполон, и поэтому элемент type недоступен для Has_Type.

...