TS概念类型名称约束

时间:2018-07-01 19:59:51

标签: c++ templates inheritance typename c++-concepts

我正在尝试使用概念作为子类的约束(由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 :(得分:6)

这是因为child当时不完整。 [class.mem] p6说:

  

在类的结尾处,类被视为完全定义的对象类型(6.7)(或完整类型)。   类说明符。

之后是一些异常(例如,不在成员函数中)。但是在基本子句中,它是不完整的,因此type不能使用成员Has_Type