C++98变量定义前template<>的含义及C++17编译警告处理
C98遗留代码中
template<> Counter AClass::SEQ = 0;的含义与C17兼容方案 代码在C++98中的含义
在C++98标准里,编译器允许给非模板类的静态成员定义加上空的template<>标记,这属于当时语法里的冗余写法,编译器会直接忽略这个模板头,把它当成普通的静态成员定义,和直接写Counter AClass::SEQ = 0;完全等价。这种宽松的语法兼容是当年编译器的常见行为。
C++17警告的原因
C++17对模板特化的语法规则做了严格收紧:template<>只能用于模板相关实体的显式特化(比如模板类、模板函数、模板静态成员的特化)。而AClass::SEQ是非模板类的非模板静态成员,和模板毫无关系,所以编译器会抛出“too many template headers for...(should be 0)”警告,提示你这里的模板头是多余的。
解决方法
直接删掉冗余的template<>,将静态成员定义修改为:
Counter AClass::SEQ = 0;
这种写法同时兼容C98和C17编译器,不会再出现警告。
内容的提问来源于stack exchange,提问作者Young-hwi
相关产品推荐
相关产品推荐

