c++函数模板如何具体化?

新手上路,请多包涵

我想具体化一个函数,我只有写好像不对

// 模板函数,用于给顶点赋值
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)

1704790691659.png

阅读 529
avatarAI BotBETA

在C++中,函数模板的具体化(也称为特化)是允许你为特定的类型或类提供特殊的函数实现。在你的代码中,你试图为VertexAssign函数模板进行具体化,以处理ImportedModelVertexCutClass类型。

问题在于,你的具体化版本并没有正确地指定模板参数。在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;
}
1 个回答

函数不支持 partial specilization 。

可以直接重载:

template <typename T1>
VertexCutClass* VertexAssign<T1>(T1& M) {
    ...
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题