【发布时间】:2016-01-12 05:15:30
【问题描述】:
在一个静态库中,我在 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 方法。
有什么问题?在.cpp文件末尾使用“模板”是否正确?
如果重要的话,我会在 Kubuntu/Raspbian 上使用 gcc 4.8/4.9,并且我使用 C++11。
【问题讨论】:
-
您至少需要在头文件中声明特化(实现仍然可以进入源文件,或者在头文件中,标记为
inline)。否则,您的程序违反了 ODR,因此格式不正确,不需要诊断。 -
换句话说,客户端代码
#include-ingClass.h看不到任何东西可以证明不实例化它自己的非专业模板版本。你必须通过向它展示声明来禁止它。 -
“声明该类专门用于 bool” -
template class Class<bool>;没有做任何此类事情。另外,不要使用保留名称作为包含守卫。 -
与主题无关,但我建议不要使用带有双下划线或前导下划线后跟大写字母的名称。它们是为实现而保留的,可能会导致未定义的行为(请参阅 C++11 标准的 17.6.4.3.2)。
-
感谢@Daniel Langr 关于
__GUARD_H__...