C++ 具有类类型非类型模板参数的类模板成员的类外定义
使用C++20,可以通过以下方式定义模板类:C++ 具有类类型非类型模板参数的类模板成员的类外定义,c++,templates,g++,c++20,non-type,C++,Templates,G++,C++20,Non Type,使用C++20,可以通过以下方式定义模板类: struct A{}; 模板 结构B{ 无效f(); }; 但是有没有可能像整数类型一样在类外定义B::f()?因为这个 模板 结构C{ 无效f(); }; 模板 void C::f(){} 编译,但这个 模板 void B::f(){} 当我试图在gcc 9上编译它时,产生一个“无效使用不完整类型”错误。奇怪的是,如果我将B替换为auto的非类型参数,而不是a,那么它编译得很好: 模板 结构B{ 无效f(); }; 模板 void B::f(
struct A{};
模板
结构B{
无效f();
};
但是有没有可能像整数类型一样在类外定义B::f()
?因为这个
模板
结构C{
无效f();
};
模板
void C::f(){}
编译,但这个
模板
void B::f(){}
当我试图在gcc 9上编译它时,产生一个“无效使用不完整类型”错误。奇怪的是,如果我将B
替换为auto
的非类型参数,而不是a
,那么它编译得很好:
模板
结构B{
无效f();
};
模板
void B::f(){}
我知道对C++20的支持在gcc 9上仍处于试验阶段,但这是可能的还是不可能的?是的,代码
template <auto a>
struct B {
void f();
};
template <auto a>
void B<a>::f() {}
模板
结构B{
无效f();
};
模板
void B::f(){}
将在C++20中编译。请注意
代码
#包括
模板
概念A=标准::是相同的::值;
模板
结构B{
无效f();
};
模板
void B::f(){}
也将在C++20中编译,因为A是一个
概念
术语是“非类型模板参数”而不是“模板参数对象”。是的,这应该可以工作,field.Dang,这是fast lmao。更准确地说,它是“类类型的非类型模板参数”,我认为“模板参数对象”是一个同义词…@SepiaColor:类类型的非类型模板参数有模板参数对象,但它们不同于抽象存在于所有专门化中的参数本身。
#include <type_traits>
template<typename T>
concept A = std::is_same<T,int>::value;
template <A a>
struct B {
void f();
};
template <A a>
void B<a>::f() {}