2016-11-17 118 views
1

我很想知道矢量类型定义中“ref”的含义是什么。C++ Vector关键字“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模板,不知何故,当c与C++ 11一起,它选择std::ref而不是该模板。

0

我几乎可以肯定它是一个类似于智能指针的用户定义类,它被设计用于替代不能用于类std::vector的标准类std::auto_ptr

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

现在不是

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::vector和其他标准容器一起使用std::unique_ptrstd::shared_ptr

该类使用因为代码是旧的和新的标准还没有与它的新类采纳或者它具有的功能,在标准缺失或更适合一些类的任务。

在他的书中More Effective C++那时候例如斯科特迈尔斯是展示如何使用引用计数智能指针可以写。这个主题在C++ 2003标准的天那WSS受欢迎。:)

很明显,这有什么共同与同样是在C++ 2011介绍,除了它的名字标准功能std::ref。:)

当代码被写有根据C++标准(D.10的auto_ptr)

既不标准功能 std::ref。:)

只要通过其中类定义的报头的样子。:)

现在3210

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

因此,由于在新的C++标准引入的新的智能指针似乎就没有必要再使用这个用户定义的类参考。

+1

太多假设导致关于不是代码的错误结论看到。从错误消息中可以明显看出,这是一种尝试滥用'std :: ref'而不是'std :: reference_wrapper'的方法。 – StoryTeller

+1

@StoryTeller你是完全错误的。它是一个用户定义的类。问题是,所需的标题不包括在内,仅此而已。:) –

+0

不,这就是你(错误地)假设发生的事情。这个问题本身没有任何建议。尝试一个[简单的例子在海湾合作委员会](http://ideone.com/TwA80b)产生确切的错误OP得到*“错误:模板参数2是无效的”* – StoryTeller

0

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

其实代码是从2006年和所使用的C++标准03

ref<StupidBug> 

是使用一些额外的功能及与不是“的std ::裁判”功能的自定义智能指针的模板。它是在一个名为“classdesc”

因为即使我不使用某种原因标题定义为“使用命名空间std;”编译器用什么来使用“ref”函数而不是模板。

对我来说,解决方法已经使用

classdesc::ref<StupidBug> 

是“classdesc”原始模板生活在那里。

从C++ 11(shared_ptr)使用新的samart指针不起作用,或者是因为原始模板的额外功能。

如果@Vlad来自莫斯科或@StoryTeller,我不知道谁更合适......