c ++如何修复我的setMaterial代码段上的无实例错误
c++ How do I fix my no instance error on my setMaterial piece of code
我刚开始用 C++ 编码,并且正在做一些关于使用 C++ 的教程,但是当我完成一部分代码时,我发现它出错了:
no instance of overload function "Unigine::ObjectMeshDynamic""setMaterial" matches the argument
这是我的代码,尽管我完全按照我的预期做了,也许我错过了一些东西,即使在一遍又一遍地查看它之后(这是在 unigine 中):
int AppWorldLogic::addMeshToScene(const char *file_name, const char *mesh_name, const char *material_name, Math::Vec3 position)
{
MeshPtr mesh = Mesh::create();
ObjectMeshDynamicPtr omd;
if (file_name)
{
if (!mesh->load(file_name))
{
Log::error("\nError opening .mesh file!\n");
mesh.clear();
return 0;
}
else omd = ObjectMeshDynamic::create(mesh);
}
else
{
mesh->addBoxSurface("box_surface", Math::vec3(0.5f));
omd = ObjectMeshDynamic::create(mesh);
}
// setting node material, name and position
omd->setMaterial(material_name, "*");
omd->setName(mesh_name);
omd->setWorldPosition(position);
Objects.append(omd);
Log::message("-> Object %s added to the scene. \n", mesh_name);
mesh.clear();
return 1;
}
如果您阅读 Unigine 的 current (2.15.1) 文档 setMaterial()
(which Unigine::ObjectMeshDynamic
inherits from Unigine::Object
),您将看到它被重载以仅接受以下参数:
void setMaterial ( const Ptr<Material> & mat, int surface )
void setMaterial ( const Ptr<Material> & mat, const char * pattern )
您正在尝试使用 2 个字符串作为输入调用 SetMaterial()
,但没有可用的重载,因此出现错误。
"*"
是一个字符串文字,它被实现为一个衰减为 const char*
的 const char[2]
数组。所以你可以安全地将它传递给 pattern
参数。
但是,您正试图将 material_name
变量(一个 const char*
字符串)传递给 mat
参数。 const char*
与 Ptr<Material>
不兼容。 setMaterial()
想要一个指向 Unigine::Material
对象而不是字符串的指针。
我查看了 早期 版本的文档,发现在 2.15 之前,还有 setMaterial()
的额外重载,其中一些接受了 const char* name
参数而不是 const Ptr<Material> &mat
参数。那些重载似乎在 2.15 中被移除了。这意味着您尝试使用的代码适用于早期版本的 Unigine,而不适用于最新版本。
您似乎是从 this documentation page, which has apparently not been updated to account for the latest Unigine version. There is obviously now another step involved to get a Material
object from a name string in the latest version. For instance, by calling Materials::findMaterial()
. Or alternatively, using setMaterialPath()
而不是 setMaterial()
复制代码。
查看 Upgrading to UNIGINE 2.15: API Migration: Materials Changes 文档。
我刚开始用 C++ 编码,并且正在做一些关于使用 C++ 的教程,但是当我完成一部分代码时,我发现它出错了:
no instance of overload function "Unigine::ObjectMeshDynamic""setMaterial" matches the argument
这是我的代码,尽管我完全按照我的预期做了,也许我错过了一些东西,即使在一遍又一遍地查看它之后(这是在 unigine 中):
int AppWorldLogic::addMeshToScene(const char *file_name, const char *mesh_name, const char *material_name, Math::Vec3 position)
{
MeshPtr mesh = Mesh::create();
ObjectMeshDynamicPtr omd;
if (file_name)
{
if (!mesh->load(file_name))
{
Log::error("\nError opening .mesh file!\n");
mesh.clear();
return 0;
}
else omd = ObjectMeshDynamic::create(mesh);
}
else
{
mesh->addBoxSurface("box_surface", Math::vec3(0.5f));
omd = ObjectMeshDynamic::create(mesh);
}
// setting node material, name and position
omd->setMaterial(material_name, "*");
omd->setName(mesh_name);
omd->setWorldPosition(position);
Objects.append(omd);
Log::message("-> Object %s added to the scene. \n", mesh_name);
mesh.clear();
return 1;
}
如果您阅读 Unigine 的 current (2.15.1) 文档 setMaterial()
(which Unigine::ObjectMeshDynamic
inherits from Unigine::Object
),您将看到它被重载以仅接受以下参数:
void setMaterial ( const Ptr<Material> & mat, int surface )
void setMaterial ( const Ptr<Material> & mat, const char * pattern )
您正在尝试使用 2 个字符串作为输入调用 SetMaterial()
,但没有可用的重载,因此出现错误。
"*"
是一个字符串文字,它被实现为一个衰减为 const char*
的 const char[2]
数组。所以你可以安全地将它传递给 pattern
参数。
但是,您正试图将 material_name
变量(一个 const char*
字符串)传递给 mat
参数。 const char*
与 Ptr<Material>
不兼容。 setMaterial()
想要一个指向 Unigine::Material
对象而不是字符串的指针。
我查看了 早期 版本的文档,发现在 2.15 之前,还有 setMaterial()
的额外重载,其中一些接受了 const char* name
参数而不是 const Ptr<Material> &mat
参数。那些重载似乎在 2.15 中被移除了。这意味着您尝试使用的代码适用于早期版本的 Unigine,而不适用于最新版本。
您似乎是从 this documentation page, which has apparently not been updated to account for the latest Unigine version. There is obviously now another step involved to get a Material
object from a name string in the latest version. For instance, by calling Materials::findMaterial()
. Or alternatively, using setMaterialPath()
而不是 setMaterial()
复制代码。
查看 Upgrading to UNIGINE 2.15: API Migration: Materials Changes 文档。