Почему я получаю & quot; не подходящую функцию для вызова ‘…’ & quot; с функцией шаблона?

С кодом ниже:

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
}

(Вотэто онлайн-версия вышеуказанного кода, который воспроизводит ошибку.)

Я получаю следующее сообщение об ошибке компиляции в закомментированной строке:

Нет подходящей функции для вызова MakeMaterial

Что я делаю неправильно? Разве явное создание экземпляра не должно позволить компилятору видеть правильную функцию?

Код компилируется, если я напишу MakeMaterial<solid> явно, но весь смысл здесь заключается в выводе type от Config аргумент. Как мне этого добиться?

0

Решение

В вызове

MakeMaterial(Config, Volume); // Error here

компилятору предлагается найти соответствие, где type::configtype в шаблоне функции, это тип Config,

Но ничего не говорит компилятору, что сопоставлять type to: это не явная реализация

Вообще может быть сотни типов, которые type может быть сопоставлено, где type::configtype будет типом Config, C ++ не поддерживает особый случай, когда существует только один такой возможный тип.

Как это исправить, зависит от того, чего вы хотели достичь.

2

Другие решения


По вопросам рекламы [email protected]