C++模板类实现迁移至class-inl.h时using与gflag放置问题
问题解决方案
using声明的处理
两种可选方案都可以避免头文件全局命名空间污染:
- 直接使用全限定名称代替using声明:所有原来用
cout的位置改为std::cout,完全省略using语句,没有任何副作用,是最稳妥的方案。 - 把using声明限制在函数内部作用域:如果不想写过长的全限定名,可以将using声明放在模板成员函数的实现内部,作用域仅局限于单个函数,不会对外层命名空间产生污染,示例如下:
// class-inl.h 中的实现示例 template<typename T> void YourClass<T>::demo_func() { using std::cout; // 仅在当前函数内生效 cout << "test output" << std::endl; }
gflag定义的处理
DEFINE_bool等gflag定义语句绝对不能放在任何头文件(包括inl头)中,否则只要头文件被多个源文件引用就会触发重复定义的链接错误,正确处理方式如下:
- 所有
DEFINE_*语句全部保留在class.cpp中,不要移动到inl文件 - 在
class-inl.h中使用gflag的位置之前,加上对应的DECLARE_bool(你的flag名称)声明,该语句仅做外部变量声明,不会生成实际符号,完全符合头文件规范,模板实现中就可以正常访问对应gflag。
常见疑问解答
能不能把using和gflag语句都放在class.cpp中?
- using声明不可以:cpp文件中的using语句作用域仅局限于该cpp本身,不会传递给被include的inl文件,inl中的模板实现代码看不到cpp里的using声明。
- gflag的
DEFINE_*语句可以也必须放在class.cpp中,只需配套在inl中加DECLARE_*声明即可正常使用。
内容的提问来源于stack exchange,提问作者PrueWho
相关产品推荐
相关产品推荐

