使用概念启用成员函数的外部类定义



在这个问题之后,我试图定义一个由类定义之外的概念启用的成员函数:

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...
}

相关内容

  • 没有找到相关文章

最新更新