2016-11-28 5 views
4

Я попробовал этот небольшой кусок кода, который я модифицированный из Концепции Технической спецификации:C++ понятия: недопустимая ссылка на функцию концепции

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

    template < typename Object > 
    requires C_Object<Object> 
    class Foo { 
    public: 
     Object test; 
    }; 

struct Component { 
    int data; 
    Component() : data(0) {} 
}; 

int main() { 
    Foo<Component> test; 
    return 0; 
} 

Но я получаю эту ошибку:

test.cpp:10:12: error: invalid reference to function concept ‘template<class T> concept bool C_Object()’ 
    requires C_Object<Object> 
      ^~~~~~~~~~~~~~~~ 
test.cpp: In function ‘int main()’: 
test.cpp:26:16: error: template constraint failure 
    Foo<Component> test; 
       ^
test.cpp:26:16: note: constraints not satisfied 
test.cpp:26:16: note: ill-formed constraint 

Первый раз я попробуйте новую версию концепций C++, где мне не хватает?

Благодаря

великий день

ответ

4

Это определение:

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

определяет C_Object как понятие функции. Это одна:

template < typename Object > 
requires C_Object<Object> 
class Foo { 
public: 
    Object test; 
}; 

использует C_Object, как будто это переменная концепция. В требуется условие, вы должны использовать () для «вызова» функция понятия:

template < typename Object > 
requires C_Object<Object>() 
class Foo { 
public: 
    Object test; 
}; 

В качестве альтернативы, вы можете использовать «сжатый» синтаксис заполнителя для ограничения Object, который не различает переменное и функцию понятия:

template < C_Object Object > 
class Foo { 
public: 
    Object test; 
}; 
+0

Ваш последний код был тем, что я искал, большое спасибо :) –

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