Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有类类型非类型模板参数的类模板成员的类外定义_C++_Templates_G++_C++20_Non Type - Fatal编程技术网

C++ 具有类类型非类型模板参数的类模板成员的类外定义

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(

使用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(){}
我知道对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() {}