std :: vector不接受我的结构作为模板

时间:2018-12-13 14:11:26

标签: c++

所以我尝试制作一个包含我的结构std::vector的{​​{1}}

menu.h

tabs

menu.cpp

class CMenu
{
public:
    void CMenu::addtab(std::string label, CCords pos, int index);
private:
    std::vector<tabs> tablist;
};

struct tabs
{
    std::string label;
    SPoint pos;
    int index;
};

当我尝试编译它时,出现这些错误。

void CMenu::Do()
{
    this->addtab("sample tab", CCords( 100, 100 ), 0);
}


void CMenu::addtab(std::string label, CCords pos, int index)
{
    tabs tab;
    tab.label = label;
    tab.pos = pos;
    tab.index = index;
    tablist.push_back(tab);
}

1 个答案:

答案 0 :(得分:10)

从形式上讲,tabs必须是完整类型,当std::vector看到它时。因此,即使是tabs前向声明(表示不完整的类型)也不够。

这意味着struct定义必须出现在CMenu之前。

请注意,此规则相对于C ++ 17有所放宽,在C ++ 17中,向量的声明和实例化的类型可能不完整,受围绕向量分配器的某些约束的约束;标准的相关部分:

  

[vector.overview] / 3在以下情况下,可以使用不完整的类型T   如果分配器满足分配器,则实例化向量   完整性要求17.6.3.5.1。 T应在任何之前完成   向量的专业化成员被引用。