对于通用库,我试图根据traits结构的正确实现来定义一个概念。特别是我想检查用户是否提供了所有必需的嵌套类型,静态成员函数和数据成员。但是,我找不到一种方法来要求嵌套的模板化类型(-alias)。
我有一个traits struct
的声明template <typename>
struct trait;
和char
s
template <>
struct trait<char> {
template <typename>
using type = int;
};
我现在用这个特性定义我的概念
template <typename T>
concept bool SatisfiesTrait = requires() {
typename trait<T>; // require the user to have spcialized
// for their type
typename trait<T>::type<long long>; // require the nested template
};
以及需要满足此概念的类型的函数
constexpr bool foo(SatisfiesTrait) { return true; }
在我的main
方法中,我尝试使用char
调用此函数:
int main() {
foo('c');
}
使用GCC编译所有这些时,我收到错误消息
prog.cc:15:24: error: 'trait<T>::type' is not a type
typename trait<T>::type<long long>;
^~~~
prog.cc: In function 'int main()':
prog.cc:26:11: error: cannot call function 'constexpr bool foo(auto:1) [with auto:1 = char]'
foo('c');
^
prog.cc:18:16: note: constraints not satisfied
constexpr bool foo(SatisfiesTrait) {
^~~
prog.cc:18:16: note: in the expansion of concept 'SatisfiesTrait<auto:1>' template<class T> concept const bool SatisfiesTrait<T> [with T = char]
但是,当我将main
功能更改为
int main() {
typename trait<char>::type<long long> v;
(void) v;
foo('c');
}
并注释掉它编译的嵌套别名模板的要求。当嵌套类型具有非类型模板参数而不是类型参数时,会出现同样的问题。
我在这里做错了什么,或者这是GCC实施Concepts TS的错误?
代码也可以在Wandbox上找到。