我的模板类的多个定义

时间:2010-10-01 08:40:22

标签: c++ templates linker

在我的库中,我有几个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有多个定义。

我该怎么做才能解决这个问题?

3 个答案:

答案 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