2016-11-28 17 views
3

Возможно, это просто плохо, но я не понимаю почему. И не нашел никакого примера с конструктором. Или, может быть, это не имеет ничего общего с конструктором ...C++ Concepts: CRTP

template < typename T > 
concept bool C_Object() { 
    return requires { 

    T(); 
    }; 
} 

template < C_Object Object> 
class DefaultManager { 

    // Content; 
}; 

template < C_Object Derived > 
class Component { 

    // Content 
}; 

struct Test : public Component<Test> { 

    int data; 

    Test() = default; 
}; 

int main() { 

    Test test; 
    return 0; 
} 

Дайте ошибку:

test2.cpp:21:36: error: template constraint failure 
struct Test : public Component<Test> { 
            ^
test2.cpp:21:36: note: constraints not satisfied 
test2.cpp:2:14: note: within ‘template<class T> concept bool C_Object() [with T = Test]’ 
concept bool C_Object() { 
       ^~~~~~~~ 
test2.cpp:2:14: note: the required expression ‘T()’ would be ill-formed 

Это звучит как: «Эй, мой код не работает, пожалуйста, исправить это», извините.

В любом случае спасибо

великий день

+1

Вы знаете, что концепции не дошли до стандарта? – SergeyA

+0

@SergeyA да, возможно, C++ 20 –

ответ

5

Проблема здесь:

struct Test : public Component<Test> { 

Всякий раз, когда вы так много, как имя специализацию сдавленным шаблона класса, заданные параметры проверены на соответствие ограничениям. В этом конкретном случае это означает, что C_Object<Test> проверен для удовлетворения, но поскольку Test является неполным - компилятор еще не проанализировал его определение - C_Object не выполняется.

Это «концептуальная» версия классической проблемы с базами CRTP: вы должны отложить проверку производного класса до тех пор, пока его определение не будет завершено.

+0

-10 баллов для C++ :( –

+0

Я даже не знал о CRTP. Слишком много для этой ночи, я думаю. Если вы достаточно сумасшедшие, мне нравится объяснение :) Но в любом случае мне действительно повезло, что вы были там. PS: Я закрою вопрос, когда буду читать о CRTP и материалах (завтра). –

+0

Даже на StackOverflow: https://stackoverflow.com/questions/19886041/will-concepts-lite-change-the-need-of-crtp-to-achieve-static-polymorphism?rq=1 Я не нашел почему мой код не работает, CRTP, похоже, в порядке (отлично работает без понятий). Я должен отложить проверку производного класса, как вы сказали, но не может найти никакой информации об этом. –

Смежные вопросы