将转发声明的类作为列表模板的引用

时间:2019-05-07 19:48:31

标签: c++ forward-declaration

我不能将对incomplate(预先声明)类的引用用作列表的模板。 但是指针工作正常。对于我所读的内容,矢量,列表和前向列表允许使用不完整的类型(而地图,集合和其他类型则不允许)

这里是例子

#include <list>
#include <vector>

class MyClass;

void foo(const MyClass&);            //works fine
std::vector<const MyClass&> ref_vec; //error
std::list<const MyClass&> ref_list;  //error
std::vector<const MyClass*> p_vec;   //works fine
std::list<const MyClass*> p_list;    //works fine

class MyClass
{};

void main(){}

1 个答案:

答案 0 :(得分:0)

这里的问题与正向声明无关。您可以通过将程序更改为以下内容来查看此内容:

#include <list>
#include <vector>

class MyClass
{};

void foo(const MyClass&);            //works fine
std::vector<const MyClass&> ref_vec; //error
std::list<const MyClass&> ref_list;  //error
std::vector<const MyClass*> p_vec;   //works fine
std::list<const MyClass*> p_list;    //works fine

int main(){}

标记为//error/works fine的行将以完全相同的方式失败。问题是std::vectorstd::list不允许具有引用类型。在C ++ 11及更高版本中,这样做的原因是元素必须为Erasable,而引用不是(更多详细信息位于问题Why can't I make a vector of references?中)。