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