首页 > 其他分享 >类静态成员函数显式具体化的编译警告

类静态成员函数显式具体化的编译警告

时间:2023-05-06 21:12:25浏览次数:48  
标签:cout void 显式 编译 bool 具体化 static

本文描述了在定义类的静态成员函数模板的显式具体化时出现的一个编译警告问题,并在解释其原因后给出了对应的解决办法。

◆ 问题

环境:macOS Mojave (版本10.14.6), clang-1001.0.46.4 (-std=c++11)

头文件中定义了类的静态成员函数模板的显式具体化,代码编译没有出错,但出现如下警告信息:

warning: explicit specialization cannot have a storage class
static void print<bool>(bool v)
~~~~~~~     ^

◆ 示例

笔者定义了类的静态成员函数模板用于输出不同基础类型,

// .h file
class Std_Out
{

...

template <class _T>
static void print(_T v)
{
    cout.width(8);
    cout << v;
}

...

}

由于按照 ios_base::boolalpha 格式选项输出 bool 类型时,指定输出宽度(cout.width)无效,所以笔者为 bool 类型新定义了该模板的一个显式具体化,

// .h file
class Std_Out
{

...

template <>
static void print<bool>(bool v)
{
    cout.width(8);
    cout << (v ? "true" : "false");
}

...

}

编译该代码时会抛出前述编译警告。

◆ 原因

C++ 语法不允许类级别的静态成员函数模板的显式具体化。

◆ 解法

方法一,在头文件的类定义中去掉显式具体化的 static 关键字,

// .h file
template <>
//static
void print<bool>(bool v)
{
    cout.width(8);
    cout << (v ? "true" : "false");
}

方法二,在头文件中去掉显式具体化的声明,把代码移到类声明外或源文件中。

// in .h file
//template <>
//static void println<bool>(bool v)
//{
//    cout.width(8);
//    cout << (v ? "true" : "false") << endl;
//}


// in .cpp file 
template <>
void Std_Out::println<bool>(bool v)
{
    cout.width(8);
    cout << (v ? "true" : "false") << endl;
}

◆ 最后

完整示例 [gitee] cnblogs/17376662

标签:cout,void,显式,编译,bool,具体化,static
From: https://www.cnblogs.com/green-cnblogs/p/17376662.html

相关文章

  • CentOS7编译dlib GPU版
    1.安装CUDA和CudNN略..2.更新cmake1)下载cmake源码wgethttps://cmake.org/files/v3.13/cmake-3.13.3-Linux-x86_64.tar.gz2)解压tarzxvfcmake-3.13.3-Linux-x86_64.tar.gz3)删除旧的cmakesudoyumremovecmake4)添加cmake环境变量sudonano/etc/profile#在最......
  • Oracle中存储过程编译卡死
    --查看锁死的存储过程的SESSION_IDSELECT*FROMDBA_DDL_LOCKSWHERENAME=UPPER('存储过程名')--获取selectt.sid,t.serial#fromv$sessiontwheret.sidin(SELECTdistinctSESSION_IDFROMDBA_DDL_LOCKSWHERENAME=UPPER('存储过程名'))--杀掉进程--分......
  • IDEA编写的SpringBoot项目修改后自动编译刷新
    问题的描述:       IDEA编写传统web应用使用外置的Tomcat时候,IDEA设置了外置的Tomcat的编译刷新,前端代码修改后是可以自动编译,页面刷新就能看到效果的。而开发SpringBoot项目的时候,因为它使用的是内置的Tomcat,所以即使是在html页面上修改内容,也必......
  • CINN 中子图编译缓存机制
    采用「问-答」形式记录研读CINN开源框架的笔记Q:CINN中子图编译的入口是在哪里?for(constauto&node_vec:clusters){//<-------逐个遍历每个子图//Classifyvarnodetoinputs,outputs,andinternals.GraphNodeSetcluster_set(node_vec.begin(),n......
  • 每天打卡一小时 第十九天 编译四部曲
    第一部曲自然语言 先将大数类的框架写好,再定义其中的函数分别写出每一个函数,通过分步骤的方法解决问题 有参构造函数首先声明函数时,默认参数定义根据数值的正负进行选择 然后进行循环将数字进行输入拷贝构造函数循环进行赋值操作公有函数成员选择正负符号循环赋......
  • 交叉编译boost库
    ./bootstrap.sh--with-toolset=gccproject-config.jam:if!gccin[feature.values<toolset>]{usinggcc:arm:/home/arci/buildroot-2023.02/output/host/bin/arm-buildroot-uclinux-uclibcgnueabi-gcc;}./b2link=static./b2link=staticinstall-......
  • Eclipse4.5Mars安装JAD反编译插件
    第一步:打开eclipse帮助中的软件安装第二步:添加站点:http://feeling.sourceforge.net/update,如下图:第三步:选择EclipseClassDecompiler,下一步,下一步第四步:接受许可,安装!图略!第五步:重启eclipse!第六步:配置Jad,下图为EclipseClassDecompiler的首选项页面,可以选择缺省的反编译器工具,并......
  • 编译?汇编?链接?
    前言我还记得在我大一的时候上C语言课,老师的期末实验是用C语言写一个命令行的管理系统,本着模块化的思想,我很自然的想到系统中具有不同职责的模块应该分到不同的文件里去,但我真的不知道C语言该怎么做这种拆分,所以最后我用一个巨大无比的文件完成了实验。现代编程语言经过层层抽象......
  • leveldb armlinx交叉编译
    首先安装所有依赖,在linux下可以直接编译成功,在armlinux低版本编译器(由于系统限制,只能使用这个版本)下有点问题。1、在CMakeLists.txt中增加set(CMAKE_C_COMPILER"/xxxxxx/arm-linux-gnueabihf-gcc")set(CMAKE_CXX_COMPILER"/xxxxxx/arm-linux-gnueabihf-g++")2、编译报错......
  • VoIP应用在Ubuntu 14.04下编译FFmpeg libX264及PJSIP
    PJSIP是一个开源的SIP协议栈。它支持多种SIP的扩展功能,可说算是最目前流行的SIP协议栈之一了。 它实现了SIP、SDP、RTP、STUN、TURN和ICE。PJSIP作为基于SIP的一个多媒体通信框架提供了非常清晰的API,以及NAT穿越的功能。PJSIP具有非常好的移植性,几乎支持现今所有系统:从桌面系统......