2016-11-17 7 views
1

Я хотел бы узнать, что означает «ref» в определении векторного типа.C++ Векторное ключевое слово "ref"

Я новичок в C++ и на кусок кода, я зачистки, чтобы узнать, я нашел

vector<ref<StupidBug> > bugs; 

где «StupidBug» является класс.

Это не компилируется в GCC/C++ 11, потому что «аргумент шаблона„>“является недопустимым», но движется «>» слева, ближе к предыдущему еще дает ту же ошибку,

Это меня смущает, и я больше не знаю, где ошибка.

Код несколько лет, может быть, плохо писать? «Ref» относится к C++?

Это многовекторный? или шаблон?

Фоновая информация:

Все о вставке и перемещении «ошибки» в сетке и вектор содержит количество ошибок и поместить их в определенном положении.

Вот код, первая у меня есть Stupidbug класс

class StupidBug 
{ 

public: 
    int x(); 
    int y(); 

    // member initialization list 
    StupidBug(GraphID_t i=-1): cellID(i) {} 

    void move(); 
    void draw(const eco_string& canvas); 
}; 

и вектор с «реф» в другом классе:

class Model: public Space 
{ 

public: 
urand u;  //random generator for positions 
int tstep; //timestep - updated each time moveBugs is called 
int scale; //no. pixels used to represent bugs 
vector<ref<StupidBug> > bugs; 
addBugs(int nBugs); 
void addBugs(); 
void moveBugs(); 
void draw(TCL_args args); 
}; 

Спасибо за любой ответ!

+1

Это не является ключевым словом. Это имя шаблона функции. – EJP

+0

В соответствии с комментарием @StoryTeller ниже, вы можете искать std :: vector > – SVictor

+0

@EJP Вы совершенно не правы. Он представляет собой пользовательский интеллектуальный указатель. –

ответ

7

Еще одна причина, чтобы остановить using namespace std;

Это шаблон функции std::ref<T>

vector<ref<StupidBug> > не может быть скомпилирован, так как std::vector ожидать типа (в типе факт 2, но другой дефолте) и вы предоставили функцию std::ref<StupidBug>


Это, вероятно, что ваш старый проект есть еще один ref шаблон и каким-то образом, когда с ompile с C++ 11, он выбирает std::ref вместо этого шаблона.

0

Я почти уверен, что это пользовательский класс, подобный интеллектуальным указателям, который был предназначен для замены стандартного класса std::auto_ptr, который не может использоваться с классом std::vector.

Возможно, этот класс использует ссылочный счет объектов.

Теперь вместо

vector<ref<StupidBug> > bugs; 

вы можете написать, например

vector<std::unique_ptr<StupidBug> > bugs; 

Обратите внимание на эту запись двух «>» символы

vector<std::unique_ptr<StupidBug> > bugs; 
           ^^^^ 

Это означает, что код был скомпилированный в соответствии со стандартом C++ 2003, когда не было новых интеллектуальных указателей, кроме std::auto_ptr, которые нельзя использовать с векторами.

В старом стандарте C++ возникла проблема относительно std::auto_ptr. В результате появились новые интеллектуальные указатели в новом стандарте C++, например std::unique_ptr или std::shared_ptr, который может использоваться вместе с std::vector и другими стандартными контейнерами.

Этот класс использовался, потому что код старый, и новый стандарт еще не был принят с его новыми классами или, возможно, он имеет функциональность, отсутствующую в стандарте или более подходящую для некоторых классов задач.

В то время, например, Скотт Мейерс в своей книге More Effective C++ показывал, как можно записать умный указатель со ссылочным счетом. Эта тема WSS популярной в то дни Стандарта на C++ 2003. :)

Очевидно, что это не имеет ничего общего со стандартной функцией std::ref, которая также была введена в C++ 2011, за исключением его имени. :)

Когда код был написан не было ни стандартной функции std::ref. :)

Просто смотреть через коллектор, где определен класс. :)

Теперь в соответствии со стандартом C++ (D.10 auto_ptr)

The class template auto_ptr is deprecated. [ Note: The class template unique_ptr (20.7.1) provides a better solution. —end note ]

Таким образом, благодаря новым интеллектуальным указателям, представленным в новом стандарте C++, кажется, что больше не нужно использовать этот пользовательский класс ref.

+1

Слишком много предположений, которые приводят к неправильным выводам о коде, который не видел. Из сообщения об ошибке видно, что это попытка неправильно использовать 'std :: ref' вместо' std :: reference_wrapper' – StoryTeller

+1

@StoryTeller. Вы совершенно ошибаетесь. Это пользовательский класс. Проблема в том, что требуемый заголовок не включен и не более. :) –

+0

Нет, это то, что вы (ошибочно) предполагаете. В этом вопросе нет ничего, чтобы предложить его. Попытка [простого примера в gcc] (http://ideone.com/TwA80b) создает точную ошибку, которую получает OP * Ошибка: аргумент шаблона 2 недействителен »* – StoryTeller

0

благодаря вашим ответам я смог исправить проблему.

На самом деле код с 2006 года и используется в C++ 03 Standard

ref<StupidBug> 

шаблон используется в качестве пользовательского смарт-указатель с некоторыми дополнительными многочисленные функции, а не функции «станд :: исх». Он определен в заголовке под названием «classdesc»

По какой-то причине, даже если я не использую «using namespace std;» компилятор хочет использовать функцию «ref» вместо шаблона.

Обходной для меня использует

classdesc::ref<StupidBug> 

будучи «classdesc», где оригинал жизни шаблона.

Использование новых указателей samart из C++ 11 (shared_ptr) не работает ни из-за дополнительных функций исходного шаблона.

Я не знаю, кто был больше прав, если @Vlad из Москвы или @StoryTeller ....

Смежные вопросы