如何使用非内联定义将成员添加到概念专用类

Bon*_*ero 13 c++ c++-concepts c++20

看看这段代码。

#include <type_traits>

template<typename T>
struct C;

template<typename T>
    requires std::is_integral_v<T>
struct C<T>
{
    void f();
};

template<typename T>
    requires std::is_integral_v<T>
void C<T>::f()
{

}

template<typename T>
    requires std::is_pointer_v<T>
struct C<T>
{
    void f();
};

template<typename T>
    requires std::is_pointer_v<T>
void C<T>::f()
{

}
Run Code Online (Sandbox Code Playgroud)

我想将函数添加到专业化中,如您所见,即非专业化变体中不存在的函数。但编译器说

类模板“C<T>”没有成员“f”。

上面的代码在 GCC 11.1.0 上编译没有任何问题,但在 Clang 13 或当前的 MSVC 上则不然。

我想转发声明的类C 而不进行任何实现。我不想有一个定义的类C,里面有一个f。在专业化中添加的内容f在我关心的基类中没有任何意义。

Quu*_*one 1

我相信你写的是正确的标准C++20;它当前无法在 Clang 上编译的事实是 Clang 中的编译器错误(#56442,也可能是#56482)。

我认为解决该错误的唯一方法是:

  • 使用普通的老式 SFINAE 而不是 C++20 约束(例如使用enable_if_t

  • 在声明点定义成员函数,而不是试图在行外定义它。(您已经将其放入同一个头文件中,那么仅内联定义它有什么问题?)