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)
我刚发帖就发现这个错误,感觉自己很蠢。
参数在类的顶部声明,这意味着在创建时参数解析为空。因为这在技术上是有效的,所以在我尝试向函数添加参数之前它不会抛出错误。移动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)