Ссылка на форвард объявленный класс как шаблон для списка - PullRequest
0 голосов
/ 07 мая 2019

Я не могу использовать ссылку для сравнения (объявленного заранее) класса в качестве шаблона для списка. Но указатель работает нормально. Для того, что я прочитал, неполные типы разрешены для вектора, списка и списка пересылки (и не разрешены для карты, множества и других)

Вот пример

#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 голосов
/ 08 мая 2019

Проблема здесь не имеет ничего общего с предварительным объявлением.Вы можете увидеть это, изменив программу следующим образом:

#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 и более поздних версиях состоит в том, что элементы должны быть стираемыми , а ссылки отсутствуют (более подробно в вопросе Почему я не могу сделатьвектор ссылок? ).

...