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_Sfinae - Fatal编程技术网

C++ 模板专门化方法

C++ 模板专门化方法,c++,templates,sfinae,C++,Templates,Sfinae,我有一个模板化的方法,我想添加一个专门化。对于函数,我将编写 template<> T function<typename T>() { /* ... */ } 我可能会忽略模板规范并依赖于C++的函数重载,但这不起作用,因为我是按返回类型重载的 如果您只想进行专业化,那么: 首先创建模板的主要定义: template<typename T> T recv(); 模板 T recv(); 然后仅创建专门化: template<> char

我有一个模板化的方法,我想添加一个专门化。对于函数,我将编写

template<> T function<typename T>() { /* ... */ }
  • 我可能会忽略模板规范并依赖于C++的函数重载,但这不起作用,因为我是按返回类型重载的

如果您只想进行专业化,那么:

首先创建模板的主要定义:

template<typename T>
T recv();
模板
T recv();
然后仅创建专门化:

template<>
char recv<char>() {return '\0';}

// likewise, but for int
template<>
int recv<int>() {return 0;}
template<> 
float recv<float>() = delete;
模板
char recv(){return'\0';}
//同样,但对于int
模板
int recv(){return 0;}
如果有人使用缺少专门化的模板,那么链接器将显示一条关于缺少函数的错误消息

因此,您必须删除特定的专业化:

template<>
char recv<char>() {return '\0';}

// likewise, but for int
template<>
int recv<int>() {return 0;}
template<> 
float recv<float>() = delete;
模板
float recv()=删除;
或所有其他专门化,但此定义必须替换主定义:

template<typename T> 
T recv() = delete;
模板
T recv()=删除;

方法和函数之间有什么区别?Clang不喜欢
模板大小\u t recv()
,因为
错误:没有函数模板匹配函数模板专用化“recv”
是否
模板t recv(){}
允许任意类型(没有专用模板的类型)工作?理想情况下,如果I
recv()
,它应该抛出编译错误,因为我不支持该数据类型。这取决于您想要什么。。。为什么要添加
{}
?并且可以专门化float来引发异常。我可以在编译时不允许吗?@charmoniumQ是的,将主模板删除:
template T recv()=delete