TS Concepts 类型名约束
TS Concepts typename constraint
我正在尝试使用一个概念作为对子类的约束(由 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>();
这让我觉得这个想法得到了支持,所以我不确定为什么这个想法会失败。有人知道为什么吗?
这是因为 child
在这一点上是不完整的。 [class.mem]p6 说:
A class is considered a completely-defined object type (6.7) (or complete type) at the closing } of the
class-specifier.
紧随其后的是一些例外情况(比如不在成员函数中)。但在 base-clause 中,它是不完整的,因此成员 type
对 Has_Type
不可用。
我正在尝试使用一个概念作为对子类的约束(由 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>();
这让我觉得这个想法得到了支持,所以我不确定为什么这个想法会失败。有人知道为什么吗?
这是因为 child
在这一点上是不完整的。 [class.mem]p6 说:
A class is considered a completely-defined object type (6.7) (or complete type) at the closing } of the class-specifier.
紧随其后的是一些例外情况(比如不在成员函数中)。但在 base-clause 中,它是不完整的,因此成员 type
对 Has_Type
不可用。