在这个问题之后,我试图定义一个由类定义之外的概念启用的成员函数:
template<typename T>
concept MyConcept = std::is_integral<T>::value; //could be anything...
template<typename T>
class F {
public:
void foo() requires MyConcept<F>;
};
template<typename T>
void F<T>::foo() requires MyConcept<F<T>>
{
//long implementation...
}
这段代码在GCC上运行良好,但在MSVC和Clang上就失败了。
注意,我需要这个概念必须满足F<T>
,而不仅仅是T
(我的实际代码要复杂得多,使用可变模板)。
演示叮当声说:
error: out-of-line definition of 'foo' does not match any declaration in 'F<T>'
void F<T>::foo() requires MyConcept<F<T>>
^~~
note: member declaration nearly matches
void foo() requires MyConcept<F>;
^
如果我将定义移动到类内,它在Clang上工作得很好,但在msvc上不行:
template<typename T>
class F {
public:
void foo() requires MyConcept<F>
{
//long implementation...
}
};
在任何情况下,我想避免长实现内部类定义。
我做错了什么?我如何定义成员函数与一个概念外的类正确启用?
这是一个编译器错误。
- 这个问题已经在Clang 16版解决了;
- 在Apple Clang上仍未解决;
- 这个问题似乎在MSVC版本19.36.32532.0上得到了解决,尽管它仍在"考虑中"。这里。
注意,对于MSVC 19.36.32532.0,在函数定义中,requires
子句必须与声明(MyConcept<F>
而不是MyConcept<F<T>>
)相同:
template<typename T>
void F<T>::foo() requires MyConcept<F>
{
//long implementation...
}