我想具体化一个函数,我只有写好像不对
// 模板函数,用于给顶点赋值template <typename T1, typename T2>T2* VertexAssign(T1& M) { // 创建一个新的T2对象 T2* v = new T2; // 获取模型的顶点、法线和纹理坐标 std::vector<glm::vec3> Vertices = M.getVertices(); std::vector<glm::vec3> NormalVector = M.getNormals(); std::vector<glm::vec2> Texture = M.getTexCoords(); // 获取模型的索引和索引数量 v->Index = M.getIndices(); v->VertexCount = M.getNumIndices(); // 获取模型中的顶点数量 int loop = M.getNumVertices(); for (int i = 0; i < loop; i++) { // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组 v->Vertex.push_back(Vertices[i].x); v->Vertex.push_back(Vertices[i].y); v->Vertex.push_back(Vertices[i].z); // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组 v->NormalVector.push_back(NormalVector[i].x); v->NormalVector.push_back(NormalVector[i].y); v->NormalVector.push_back(NormalVector[i].z); // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组 v->Texture.push_back(Texture[i].s); v->Texture.push_back(Texture[i].t); } return v;}template <>VertexClass* VertexAssign<ImportedModel, VertexClass>(ImportedModel& M) { // 创建一个新的VertexClass对象 VertexClass* v = new VertexClass; // 获取模型的顶点、法线和纹理坐标 std::vector<glm::vec3> Vertices = M.getVertices(); std::vector<glm::vec3> NormalVector = M.getNormals(); std::vector<glm::vec2> Texture = M.getTextureCoords(); // 获取模型中的顶点数量 int loop = M.getNumVertices(); v->VertexCount = loop; for (int i = 0; i < loop; i++) { // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组 v->Vertex.push_back(Vertices[i].x); v->Vertex.push_back(Vertices[i].y); v->Vertex.push_back(Vertices[i].z); // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组 v->NormalVector.push_back(NormalVector[i].x); v->NormalVector.push_back(NormalVector[i].y); v->NormalVector.push_back(NormalVector[i].z); // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组 v->Texture.push_back(Texture[i].s); v->Texture.push_back(Texture[i].t); } return v;}template <typename T1>VertexCutClass* VertexAssign<T1 , VertexCutClass>(T1& M) { // 创建一个新的VertexCutClass对象 VertexCutClass* v = new VertexCutClass; // 获取模型的顶点、法线和纹理坐标 std::vector<glm::vec3> Vertices = M.getVertices(); std::vector<glm::vec3> NormalVector = M.getNormals(); std::vector<glm::vec2> Texture = M.getTexCoords(); // 获取模型的索引和索引数量 v->Index = M.getIndices(); v->VertexCount = M.getNumIndices(); // 获取模型中的顶点数量 int loop = M.getNumVertices(); for (int i = 0; i < loop; i++) { // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组 v->Vertex.push_back(Vertices[i].x); v->Vertex.push_back(Vertices[i].y); v->Vertex.push_back(Vertices[i].z); // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组 v->NormalVector.push_back(NormalVector[i].x); v->NormalVector.push_back(NormalVector[i].y); v->NormalVector.push_back(NormalVector[i].z); // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组 v->Texture.push_back(Texture[i].s); v->Texture.push_back(Texture[i].t); } return v;}
这样写好像不对
template <typename T1>VertexCutClass* VertexAssign<T1 , VertexCutClass>(T1& M)
函数不支持 partial specilization 。
可以直接重载:
template <typename T1>VertexCutClass* VertexAssign<T1>(T1& M) { ...}
在C++中,函数模板的具体化(也称为特化)是允许你为特定的类型或类提供特殊的函数实现。在你的代码中,你试图为VertexAssign
函数模板进行具体化,以处理ImportedModel
和VertexCutClass
类型。
问题在于,你的具体化版本并没有正确地指定模板参数。在C++中,函数模板的具体化需要在函数名前添加template<>
,并在参数列表中指定模板参数。
以下是正确的方法:
// 模板函数,用于给顶点赋值template <typename T1, typename T2>T2* VertexAssign(T1& M) { // 创建一个新的T2对象 T2* v = new T2; // 获取模型的顶点、法线和纹理坐标 std::vector<glm::vec3> Vertices = M.getVertices(); std::vector<glm::vec3> NormalVector = M.getNormals(); std::vector<glm::vec2> Texture = M.getTexCoords(); // 获取模型的索引和索引数量 v->Index = M.getIndices(); v->VertexCount = M.getNumIndices(); // 获取模型中的顶点数量 int loop = M.getNumVertices(); for (int i = 0; i < loop; i++) { // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组 v->Vertex.push_back(Vertices[i].x); v->Vertex.push_back(Vertices[i].y); v->Vertex.push_back(Vertices[i].z); // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组 v->NormalVector.push_back(NormalVector[i].x); v->NormalVector.push_back(NormalVector[i].y); v->NormalVector.push_back(NormalVector[i].z); // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组 v->Texture.push_back(Texture[i].s); v->Texture.push_back(Texture[i].t); } return v;}// 针对ImportedModel的具体化版本template <>VertexClass* VertexAssign<ImportedModel, VertexClass>(ImportedModel& M) { // 创建一个新的VertexClass对象 VertexClass* v = new VertexClass; // 获取模型的顶点、法线和纹理坐标 std::vector<glm::vec3> Vertices = M.getVertices(); std::vector<glm::vec3> NormalVector = M.getNormals(); std::vector<glm::vec2> Texture = M.getTextureCoords(); // 获取模型中的顶点数量 int loop = M.getNumVertices(); v->VertexCount = loop; for (int i = 0; i < loop; i++) { // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组 v->Vertex.push_back(Vertices[i].x); v->Vertex.push_back(Vertices[i].y); v->Vertex.push_back(Vertices[i].z); // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组 v->NormalVector.push_back(NormalVector[i].x); v->NormalVector.push_back(NormalVector[i].y); v->NormalVector.push_back(NormalVector[i].z); // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组 v->Texture.push_back(Texture[i].s); v->Texture.push_back(Texture[i].t); } return v;}
在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty
我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。
我正在尝试创建一个模板函子,它将使用任意数量的参数作为参数对象和成员函数。我不知道如何用模板正确地编写代码。 如果我使对象::方法没有参数-代码编译。但是有参数-没有。 严重性代码描述项目文件行抑制状态错误C2664'int Builder::运算符()(T
在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp
本文向大家介绍C++函数模板与类模板实例解析,包括了C++函数模板与类模板实例解析的使用技巧和注意事项,需要的朋友参考一下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解。具体内容如下: 泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思。泛
是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。