在静态库中,我在Class.h中声明了一个模板,然后我专门在Class.cpp中使用了一些方法。我想在链接到这个库的项目中使用这个类。
我把专业化放在一个.cpp文件中,以避免像已经声明的那样的错误" (???)在同一个.cpp的结尾处结束一旦我知道这个类的所有内容,我就宣布了特化的存在。这是代码:
Class.h
#ifndef __CLASS_H__
#define __CLASS_H__
template<class T>
class Class
{
public:
~Class(){}
Class(){}
//...
void method1()
{ /* unspecialized job here */ }
};
#endif
Class.cpp
#include "Class.h"
template<>
void Class<bool>::method1()
{
/* Specialized job for bool here */
}
// Declare that the class is specialized for bool
template class Class<bool>;
现在,在我使用该库的项目中,当我尝试实例化class Class<bool>
的对象时,它仍然使用 unspecialized 方法。
有什么问题?是使用&#34;模板&#34;在.cpp文件的末尾是否正确?
我在Kubuntu / Raspbian上使用gcc 4.8 / 4.9,如果它有重要性,我使用C ++ 11。
答案 0 :(得分:3)
模板专精
Crypt::encrypt()
仅在Class.cpp中看到。如果在代码中的任何其他位置使用Crypt::decrypt($first_name) == 'FirstNameTest1'
,那么这些特化在那里不可见。因此,泛型类模板用于实例化template<>
void Class<bool>::method1()
{
/* Specialized job for bool here */
}
// Declare that the class is specialized for bool
template class Class<bool>;
。
如果希望所有使用Class<bool>
的文件都可以看到特化,请将它们移动到Class.h。此时,Class.cpp将不再需要,除非它具有除上述行之外的代码。
答案 1 :(得分:-1)
您需要使用extern模板才能使专业化生效。
在你的cpp中你有专业化和这一行:
template struct MyClass<bool>;
然后添加到标题:
extern template struct MyClass<bool>;
现在编译器将被告知不要实例化模板,而是在cpp中获取实例化的模板。