C ++ Vector关键字" ref"

时间:2016-11-17 06:24:18

标签: c++ vector

我想知道" ref"的含义是什么?在矢量类型定义中。

我是C ++的新手,在我要剥离的代码中,我发现了

vector<ref<StupidBug> > bugs;

其中“StupidBug”是一个类。

它不能在gcc / C ++ 11中编译,因为&#34;模板参数&#34;&gt;&#34;无效&#34;但是将“&gt;”向左移动,更靠近前一个仍然会产生相同的错误

这让我感到困惑,我不知道错误在哪里。

代码已有几年了,难道写得不好吗?是&#34; ref&#34;属于c ++?

这是一个多元化的人吗?还是模板?

背景信息:

整体是关于插入和移动&#34;错误&#34;在网格中,向量包含错误的数量并将它们放在某个位置。

这里是代码,首先我有一个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);
};

带有&#34; ref&#34;的向量在另一个班级:

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);
};

感谢您的回答!

3 个答案:

答案 0 :(得分:7)

停止using namespace std;

的另一个原因

这是功能模板std::ref<T>

vector<ref<StupidBug> >无法编译,因为std::vector期望一个类型(事实上是2种类型,但另一种是默认类型)并且您提供了一个函数std::ref<StupidBug>

可能你的旧项目有另一个ref模板,不知何故,当用C ++ 11编译时,它选择std::ref而不是那个模板。

答案 1 :(得分:0)

我几乎可以肯定它是一个类似于智能指针的用户定义类,旨在替换不能与类std::auto_ptr一起使用的标准类std::vector

此类可能使用对象的引用计数。

现在而不是

vector<ref<StupidBug> > bugs;

你可以写例如

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

注意这两个'&gt;'符号的记录

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

这意味着当没有新的智能指针(std::auto_ptr除外)不能与向量一起使用时,代码是根据C ++ 2003标准编译的。

旧版C ++标准相对于std::auto_ptr存在问题。因此,新的C ++标准中引入了新的智能指针,如std::unique_ptrstd::shared_ptr,可以与std::vector和其他标准容器一起使用。

使用此类是因为代码已经过时,新标准尚未与其新类一起使用,或者它可能具有标准中不存在的功能或更适合某类任务。

当时,例如Scott Meyers在他的书More Effective C++中展示了如何编写带引用计数的智能指针。这个主题在C ++ 2003标准的那些日子很流行。:)

很明显,除了名称之外,C ++ 2011中引入的标准函数std::ref也没有什么共同之处。:)

编写代码时,既没有标准函数std::ref。:)

只需查看定义类的标题。:)

现在根据C ++标准(D.10 auto_ptr)

  

不推荐使用类模板auto_ptr。 [注意:类模板   unique_ptr(20.7.1)提供了更好的解决方案。 - 后注]

因此,由于新C ++标准中引入了新的智能指针,似乎不再需要使用此用户定义的类ref。

答案 2 :(得分:0)

感谢您的回答,我能够解决问题。

实际上代码来自2006年并使用了c ++ 03标准

ref<StupidBug> 

是一个模板,用作自定义智能指针,带有一些额外的功能,而不是“std :: ref”功能。它在名为“classdesc”的标题中定义

出于某种原因,即使我没有使用&#34;使用命名空间std;&#34;编译器使用“ref”函数而不是模板。

我的解决方法一直在使用

classdesc::ref<StupidBug>

是原始模板所在的“classdesc”。

使用来自C ++ 11(shared_ptr)的新samart指针,由于原始模板的额外功能,因此无法正常工作。

如果来自莫斯科的@Vlad或@StoryTeller,我不知道谁更正确....