【发布时间】:2017-02-18 22:01:35
【问题描述】:
我们有:
template<typename T>
struct A {
void foo(int a) {
T::foo(a);
}
};
template<typename T>
struct B {
template struct A<T>; // concept check
};
所以,我定义了一个概念检查器 A,它通过将 foo 转发到 T::foo 来检查 T。
现在,我想通过显式实例化检查传递给 B 的参数是否满足概念 A,但编译器抱怨它是错误的命名空间。我该如何解决?
【问题讨论】:
-
A不是一个概念。这是一个struct。即使使用 Concepts TS,它仍然是一个结构;在概念 TS 中,概念是函数或变量。所以你的问题似乎很困惑。 -
好吧,忽略混乱。如何申请支票?
-
应用什么检查?如前所述,
A不检查任何内容。 -
编译器应该抱怨 T::foo 不存在,例如如果 B 是用空结构实例化的。
-
A::foo在 odr 使用(调用,或获取其地址)之前不会被实例化。只有这样编译器才会验证表达式T::foo(a);是否有意义。我想您可以创建一个将函数指针作为非类型模板参数的模板,并使用&A<T>::foo对其进行实例化。
标签: c++ c++11 c++-concepts