为什么我使用模板函数获得“没有匹配函数来调用'...'”?

时间:2015-06-29 18:26:14

标签: c++ templates compiler-errors overload-resolution explicit-instantiation

使用以下代码:

materia.h:

#ifndef MATERIA_H
#define MATERIA_H

class material
{
public:
  template <class type>
  static material* MakeMaterial(typename type::configtype, long);
  template <class type>
  void CreateNaturalForm(typename type::configtype, long);
  … 
};

template <class type>
material* material::MakeMaterial(typename type::configtype Config, long Volume)
{
  return type::Spawn(Config, Volume);
}

#endif

materias.h:

#ifndef MATERIAS_H
#define MATERIAS_H

#include "materia.h"
#include "confdef.h"

class solid : public material {
public:
  typedef solidmaterial configtype;
  … 
};

template material* material::MakeMaterial<solid>(solidmaterial, long);

template <class type>
void material::CreateNaturalForm(typename type::configtype Config, long Volume)
{
  … 
  MakeMaterial(Config, Volume); // Error here
  … 
}

template void material::CreateNaturalForm<solid>(solidmaterial, long);

#endif

confdef.h:

#ifndef CONFDEF_H
#define CONFDEF_H

enum solidmaterial {
  WOOD,
  … 
};

#endif

的main.cpp

#include "materia.h"
#include "materias.h"
#include "confdef.h"

int main()
{
  material::MakeMaterial(WOOD, 500); // Same error here
}

Here是上述代码的在线版本,可以重现错误。)

我在注释行上收到以下编译错误消息:

  

没有匹配函数来调用'MakeMaterial'

我做错了什么?显式实例化是否应该允许编译器看到正确的函数?

如果我明确地写MakeMaterial<solid>,代码就会编译,但这里的重点是从type参数中推导出Config。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

在通话中

MakeMaterial(Config, Volume); // Error here

要求编译器找到匹配函数模板中的type::configtypeConfig的类型。

但没有任何东西告诉编译器要匹配type的内容:这不是一个明确的实例化。

一般情况下,type可以匹配数百种类型,其中type::configtype类型为Config。 C ++不支持只有一种可能类型的特殊情况。

如何解决这个问题取决于你想要完成的任务。