写模板代码时需要注意头文件引入顺序

最近修改一处模板代码的时候遇到一个问题,模板函数里面调用的全局接口在编译的时候报错, 检查了一下代码没啥问题。然后用宏写了个类似的调用也没啥问题。

全局函数所在的头文件的也引入了的 但编译始终报 syntax error 符号解析错

尝试了几次以后发现在引入顺序上可能存在问题。

假设模板定义在   temp.h 里,全局函数定义在 global.h里

使用模板的地方在 test.cpp, 引入顺序为 1 temp.h     2 global.h

根据报错的原因猜测编译器在模板决议的时期 并没将后面的include都包含进来,而只是在之前的引入文件里找相关符号符合不符合模板里的代码约定。导致全局函数的符号不认识。这个问题在模板参数的处理上又没有问题, 即如果你作为参数的类型申明头文件include在temp.h之后,一样能编译通过。

这个问题还有一点值得注意, 原本模板相关的符号解释需要引入的头文件只需模板决议的那个文件引入,即谁使用了这个模板,引入这个模板里的所有符号 相关申明头文件只要这个文件里引入就行, 但全局符号出现后 ,任何包含temp.h的文件不管使用不适用这个模板 都需要在之前引入global.h 才能编译通过。很费解


猜你喜欢

转载自blog.csdn.net/evilswords/article/details/38820805