在我的库中,我有几个initialize()
和cleanup()
函数,用于它所依赖的不同模块。
为了使这部分更安全,我决定遵循RAII规则并建立一个Initializer
模板类,它将两个函数作为参数:
// initializer.hpp (include guards omitted)
template <void initialize(), void cleanup()>
class Initializer
{
// Does something, but that's not relevant
};
现在,在我的xml.hpp
文件中,我有这个:
// xml.hpp (include guards omitted)
namespace xml
{
void initialize();
void cleanup();
typename ::Initializer<&initialize, &cleanup> Initializer;
}
此编译很好但链接失败,因为多个文件包含xml.hpp
,gcc抱怨xml::Initializer
有多个定义。
我该怎么做才能解决这个问题?
答案 0 :(得分:3)
namespace xml
{
void initialize();
void cleanup();
typename ::Initializer<&initialize, &cleanup> Initializer;
}
typename
在这里是非法的,只允许在模板定义中使用。你的意思是typedef
!
namespace xml
{
void initialize();
void cleanup();
typedef ::Initializer<&initialize, &cleanup> Initializer;
}
答案 1 :(得分:2)
typename ::Initializer<&initialize, &cleanup> Initializer;
这是一个明确的实例化。请将其放在一个且只有一个翻译单元
答案 2 :(得分:0)
在这些宏中包含您的xml.hpp代码
#ifndef XML_HPP
#define XML_HPP
// Include code here
#endif