我正在使用varadic参数来尝试对我正在使用的类进行模板化,当我尝试调用类中的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;
};
调用的函数:
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);
错误:
Error C2660 'RenderComponentGroup<SpriteRender>::addComponent': function does not take 3 arguments SpaceEngine D:RepositoriesSpace EngineSpaceGamesrcgamestatesOverworld.cpp 33
我刚发布这条消息就发现了错误,我觉得自己很愚蠢。
参数是在类的顶部声明的,这意味着在创建时,参数解析为空。因为这在技术上是有效的,所以直到我尝试向函数添加参数时,它才抛出错误。将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;
};