Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有嵌套类型的类的概念_C++_C++14_C++ Concepts - Fatal编程技术网

C++ 具有嵌套类型的类的概念

C++ 具有嵌套类型的类的概念,c++,c++14,c++-concepts,C++,C++14,C++ Concepts,我正在编写一个概念,它要求类具有ValueType类型别名,并具有一个静态函数Check,该函数接受ValueType并返回void 以下是我到目前为止的情况: template <typename T> concept bool Predicate() { return requires(T object) { typename T::ValueType; requires (T::ValueType value) {

我正在编写一个概念,它要求类具有
ValueType
类型别名,并具有一个静态函数
Check
,该函数接受
ValueType
并返回
void

以下是我到目前为止的情况:

template <typename T>
concept bool Predicate()
{
    return requires(T object)
    {
        typename T::ValueType;
        requires (T::ValueType value)
        {
            {T::Check(value)} -> void;
        };
    };
}
模板
概念布尔谓词()
{
返回要求(T对象)
{
typename T::ValueType;
需要(T::ValueType值)
{
{T::Check(value)}->void;
};
};
}

编译时不会出现以下错误:
error:expected'),在“value”之前。

我找到了一个解决方案,它包括在两个不同的概念中拆分
谓词

template <typename T>
concept bool HasCheck()
{
    return requires (typename T::ValueType value)
    {
        {T::Check(value)} -> void;
    };
};

template <typename T>
concept bool Predicate()
{
    return requires(T object)
    {
        typename T::ValueType;
        requires HasCheck<T>();
    };
}

您将问题复杂化了:

template <typename T>
concept bool Predicate = requires(typename T::ValueType obj) {
    { T::Check(obj) } -> void;
};
模板
concept bool Predicate=requires(typename T::ValueType obj){
{T::Check(obj)}->void;
};

Ahh。。。C++20。。。很好…
requires
typename
将是最低限度的修复。谢谢,我还发现我不需要
t对象
部分。您仍然需要
typename t::ValueType在正文中,如果您希望它是偏序的,但是+1。
template <typename T>
concept bool Predicate = requires(typename T::ValueType obj) {
    { T::Check(obj) } -> void;
};