Visual Studio C++没有重载函数的示例匹配参数列表

z8dt9xmd  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(194)

我有一个问题与visual studio的intellisense,它标志着我,我不能推到一个向量的结构,我做了存储某些数据的一个小OpenGL项目,我试图通过新的结构的数据,我想添加到向量,但它使一个错误,但我不知道为什么,当我创建的结构和存储在一个变量,然后推变量到向量,它不标记错误,所以我不知道有什么问题,当我传递一个int型变量时,它会标记错误,但当我传递一个原始数字时,直接在结构体的构造函数中就可以了。

struct VertexBufferElement
{
    unsigned int type;
    unsigned int count;
    bool normalize;
};

void funtion(int count)
{
    //the vector of the struct above
    std::vector<VertexBufferElement> elements;

    //This is not allowed
    elements.push_back({GL_FLOAT,count,false });
        
    //This is allowed
    elements.push_back({GL_FLOAT,4,false});
        
    //This is allowed
    struct VertexBufferElement vb = { GL_FLOAT,count,false };
    elements.push_back(vb);
}
rxztt3cl

rxztt3cl1#

就像你说的:
//这是允许的
int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int] int [int]
因此,您应该能够用途:

elements.emplace_back(GL_FLOAT,count,false);

而不会触发过载解决方案上的错误智能感知错误。
它还在适当的位置构造元素(如您发布的“允许”示例),所以它更整洁-我在这里避免说性能更好,因为区别应该是微不足道的

f87krz0w

f87krz0w2#

这是因为count的类型是int,所以将其转换为unsigned int VertexBuffer::count是一个收缩转换,这在花括号初始化器中是不允许的。
它允许像4这样的常量表达式,因为它可以转换为unsigned int而不需要缩小(它肯定会在范围内,即不是负数)。
你需要设置参数unsinged int

void function(unsigned count) { ... }

添加造型:

void function(int count) {
    elements.push_back({GL_FLOAT, unsigned(count), false });
    struct VertexBufferElement vb = { GL_FLOAT, unsigned(count), false };
}

或者使用带括号的初始化器(在C++20/23模式下):

void function(int count) {
    elements.push_back(VertexBufferElement(GL_FLOAT, count, false));
    struct VertexBufferElement vb(GL_FLOAT, count, false);
}

(By struct VertexBufferElement vb = { GL_FLOAT,count,false };的方式也是“不允许的”,因为收缩,但许多编译器允许它,只是作为一个扩展警告)

相关问题