在我的库中,我有几个initialize()cleanup()函数,它们依赖于不同的模块。

为了使该部分更安全地使用,我决定遵循RAII规则,并建立了一个Initializer 模板类o​​jit_rstrong,该类使用两个函数作为参数:

// 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有多个定义。

我该怎么解决?

最佳答案

namespace xml
{
  void initialize();
  void cleanup();

  typename ::Initializer<&initialize, &cleanup> Initializer;
}
typename在这里是非法的,仅在模板定义中允许。您的意思是typedef!
namespace xml
{
  void initialize();
  void cleanup();

  typedef ::Initializer<&initialize, &cleanup> Initializer;
}

关于c++ - 我的模板类的多个定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3837637/

10-11 18:40