我不能将对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(){}
答案 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::vector
和std::list
不允许具有引用类型。在C ++ 11及更高版本中,这样做的原因是元素必须为Erasable,而引用不是(更多详细信息位于问题Why can't I make a vector of references?中)。