使用以下代码:
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
。我怎样才能做到这一点?
答案 0 :(得分:2)
在通话中
MakeMaterial(Config, Volume); // Error here
要求编译器找到匹配函数模板中的type::configtype
,Config
的类型。
但没有任何东西告诉编译器要匹配type
的内容:这不是一个明确的实例化。
一般情况下,type
可以匹配数百种类型,其中type::configtype
类型为Config
。 C ++不支持只有一种可能类型的特殊情况。
如何解决这个问题取决于你想要完成的任务。