无法强制实例化专用模板

时间:2016-01-12 05:15:31

标签: c++ templates c++11

静态库中,我在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。

2 个答案:

答案 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中获取实例化的模板。