C++ 可变参数 - 函数不会接受任何附加参数

wil*_*tin 0 c++ templates vector

addComponent我正在使用可变参数来尝试对我正在使用的类进行模板化,当我尝试在类中调用该函数时,出现该函数不接受 3 个参数的错误。我非常不确定为什么会这样,而且我还没有找到解决办法。

班级代码:

template <typename T, typename... Args>
class RenderComponentGroup : public RenderGroupBase
{
public:
using RenderGroupBase::RenderGroupBase;
void iterate() { IterateRenderComps<T>(m_Components); };
void addComponent(std::vector<RenderComponent*>* compPointers, Args... arguments)
{
    //Check if any dead
    for (int i = 0; i < m_Components.size(); i++)
    {
        if (m_Components[i].isDead())
        {
            m_Components.emplace(m_Components.begin() + i, arguments...);
            m_Components[i].updatePointer();
            return;
        }
    }

    //Resize components array
    m_Components.emplace_back(arguments...);
    m_Components[m_Components.size() - 1].attachToObject(compPointers);
    for (int i = 0; i < m_Components.size(); i++)
    {
        m_Components[i].updatePointer();
    }
}
private:
    unsigned int m_ID = 0;
    std::vector<T> m_Components;
};
Run Code Online (Sandbox Code Playgroud)

函数调用:

std::shared_ptr<RenderComponentGroup<SpriteRender>> spriteGroup(new   RenderComponentGroup<SpriteRender>());
//Everything after renderComps is the arguments
spriteGroup->addComponent(&sprite->m_RenderComps, &sprite->m_Sprite, &m_SpriteRenderer);
Run Code Online (Sandbox Code Playgroud)

错误:

Error   C2660   'RenderComponentGroup<SpriteRender>::addComponent': function does not take 3       arguments    SpaceEngine D:\Repositories\Space Engine\SpaceGame\src\game\states\Overworld.cpp    33  
Run Code Online (Sandbox Code Playgroud)

wil*_*tin 5

我刚发帖就发现这个错误,感觉自己很蠢。

参数在类的顶部声明,这意味着在创建时参数解析为空。因为这在技术上是有效的,所以在我尝试向函数添加参数之前它不会抛出错误。移动template<typname... Args>到函数本身的顶部意味着它解析为函数调用中的参数。

固定的:

template <typename T>
class RenderComponentGroup : public RenderGroupBase
{
public:
template<typename... Args>
void addComponent(std::vector<RenderComponent*>* compPointers, Args... arguments)
{
    //Check if any dead
    for (int i = 0; i < m_Components.size(); i++)
    {
        if (m_Components[i].isDead())
        {
            m_Components.emplace(m_Components.begin() + i, arguments...);
            m_Components[i].updatePointer();
            return;
        }
    }

    //Resize components array
    m_Components.emplace_back(arguments...);
    m_Components[m_Components.size() - 1].attachToObject(compPointers);
    for (int i = 0; i < m_Components.size(); i++)
    {
        m_Components[i].updatePointer();
    }
}
private:
    unsigned int m_ID = 0;
    std::vector<T> m_Components;
};
Run Code Online (Sandbox Code Playgroud)