oli*_*ver 26 c++ linux linker templates g++
假设我有fileA.h一个声明classA具有模板功能的类SomeFunc<T>().此函数直接在头文件中实现(通常用于模板函数).现在我添加一个专门的实现SomeFunc()(比如for SomeFunc<int>())fileA.C(即不在头文件中).
如果我现在SomeFunc<int>()从其他代码调用(也许还来自另一个库),它会调用泛型版本还是专门化版本?
我现在遇到这个问题,类和函数存在于两个应用程序使用的库中.一个应用程序正确使用专门化,而另一个应用程序使用通用形式(稍后会导致运行时问题).为什么不同?这可能与链接器选项等有关吗?这是在Linux上,使用g ++ 4.1.2.
Ant*_*ams 23
对于在调用点处不可见的模板具有专门化是错误的.遗憾的是,编译器不需要诊断此错误,然后可以使用您的代码执行他们喜欢的操作(在标准中它"形成错误,无需诊断").
从技术上讲,您需要在头文件中定义特化,但几乎每个编译器都会按照您的预期处理这个:这在C++ 11中使用新的"extern模板"工具修复:
extern template<> SomeFunc<int>();
Run Code Online (Sandbox Code Playgroud)
这明确声明特定的特化是在别处定义的.许多编译器已经支持这一点,有些是有的,有些没有extern.
您是否在头文件中添加了带参数的原型?
我的意思是在fileA.h中有某处
template<> SomeFunc<int>();
Run Code Online (Sandbox Code Playgroud)
如果不是那可能是原因.