如何为该模板正确编写专业化的文字?

时间:2019-11-19 17:38:21

标签: c++ templates template-specialization

我最近正在为Vulkan框架开发Vertex类。我想编写一些函数来收集有关顶点的信息(例如属性数)作为模板,而不是静态函数(这可能是更简单的方法)。因此,这些模板必须专门用于每个Vertex类。我遇到了有关模板专业化的问题

template <typename T>
constexpr uint32_t GetAttributeCount()
{
    return 0;
}

template <typename T>
constexpr std::array<VkVertexInputAttributeDescription, GetAttributeCount<T>()> getAttributeDescriptions()
{
    return {};
}

struct Vertex_p2_c3
{
    glm::vec3 position;
    glm::vec2 color;
};

// Declarations of specializations
template <>
constexpr uint32_t GetAttributeCount<Vertex_p2_c3>(); // returns 2

template <>
constexpr std::array<VkVertexInputAttributeDescription, GetAttributeCount<Vertex_p2_c3>()> getAttributeDescriptions<Vertex_p2_c3>();

最后一行出现两个错误:

C2975   '_Size': invalid template argument for 'std::array', expected compile-time constant expression

我不理解,因为GetAttributeCount被声明为constexpr。第二个是

C2912   explicit specialization 'std::array<VkVertexInputAttributeDescription,0> lib::getAttributeDescriptions<lib::Vertex_p2_c3>(void)' is not a specialization of a function template

如何正确地将getAttributeDescriptions专用于Vertex_p2_c3


在此先感谢您,让我知道是否应该制定不需要Vulkan的MRE或提供这些专业化的实现

0 个答案:

没有答案